第5章 资源类型
这一大章节的每个部分描述了一类应用资源的用法,格式和语法。你可以把这些资源放在你的资源目录下(即res/)。下面是对每个资源类型的简介:
◆动画资源(Animation Resources)
定义预设的动画。
补间动画被保存在res/anim目录下且可通过R.anim这个类访问它。
帧动画保存在res/drawable/目录下,可通过R.drawable这个类访问它。
◆颜色状态列表资源(Color State List Resource)
定义了一个根据视图状态改变的颜色资源。
保存在res/color,通过R.color这个类访问。
◆可绘制的资源(Drawable Resources)
用位图或XML定义各种各样的图像。
保存在res/drawable/目录下,通过R.drawable这个类访问。
◆布局资源(Layout Resource)
定义你应用程序用户界面的布局。
保存在res/layout/目录下,通过R.layout这个类访问。
◆菜单资源(Menu Resource)
定义你的应用程序的菜单内容。
保存在res/menu目录下,通过R.menu这个类访问。
◆字符串资源(String Resources)
定义字符串,字符串数组和复数(字符串的格式和风格)。
保存在res/values目录下,通过R.string、R.array和R.plurals这几个类访问。
◆风格资源(Style Resource)
定义用户界面的元素的格式和外观。
保存在res/values目录下,通过R.style这个类访问
◆更多的资源类型(More Resource Types)
定义各种各样的值,如布尔值,整数值,数量值,颜色值,和其他数组。
保存在res/values下,且每个都用特有的R的子类访问(如R.bool,R.integer,R.dimen等等)。
5.1 动画
Android框架提供了两种动画系统:
property animation(属性动画,在Android 3.0中引入)
view animation(视图动画)。
这两种动画系统是可行的方案,但属性动画系统,在一般情况下,是首选的方法使用,因为它更灵活,并提供更多的功能。除了这两个,我们还可以利用Drawable animation(帧动画),它允许你加载绘制的资源,并逐帧显示。
视图的动画系统提供的功能,只针对动画Vuew对象,所以如果你想动画非View对象,你要实现自己的代码来实现。视图动画系统事实上只能暴露一个视图对象几个方面的动画,如缩放和旋转视图,但没有背景颜色。
View动画系统的另一个缺点是,只有修改,而不是实际的视图本身。 例如,如果你的动画在屏幕上移动一个按钮,按钮绘制正确,当你按下按钮,但按钮实际的位置不会改变,所以你要实现自己的逻辑来处理这个问题。
相比属性动画系统,这些限制完全消除,你可以动画任何对象的任何属性(View和非View)和对象本身实际也是可以被修改。属性动画系统也更强大的方式进行了动画。在一个较高的水平,你分配动画要动画的属性,如颜色,位置或大小,可以定义方面,如插补和同步多个动画的动画。
然而,View动画系统,花费更少的时间设置,需要更少的代码。如果View动画完成了你需要做的,或者你现有的代码已经完成了工作,那就没有必要使用属性动画系统。
5.1.1属性动画
在XML中定义的一个动画,在设定的时间内修改目标对象的属性,例如背景颜色或alpha值。
文件路径:
res/animator/filename.xml
文件名将被作为资源ID使用
编译资源数据类型:
ValueAnimator, ObjectAnimator,或AnimatorSet
资源引用:
Java: R.animator.filename
XML: @[package:]animator/filename
语法,如代码清单5-1所示:
<set android:ordering=["together" | "sequentially"]> <objectAnimator android:propertyName="string" android:duration="int" android:valueFrom="float | int | color" android:valueTo="float | int | color" android:startOffset="int" android:repeatCount="int" android:repeatMode=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <animator android:duration="int" android:valueFrom="float | int | color" android:valueTo="float | int | color" android:startOffset="int" android:repeatCount="int" android:repeatMode=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <set> ... </set> </set>
代码清单5-1
这个文件必须有一个单一的根节点:<set>。你可以组合各种动画元素到一起。
元素:
<set>
一个支撑其他动画元素的容器(<objectAnimator>,<valueAnimator>,<set>)。
你能制定<set>标签嵌套到深一层的组合。每一个<set>能定义它自己的ordering属性。
属性:
android:ordering
指定动画播放的顺序
值 |
描述 |
sequentially |
循序的播放动画 |
together (默认) |
同一时刻一起播放动画 |
下面让我们看一个实例:
XML文件保存在res/animator/property_animator.xml,如代码清单5-2所示:
<set android:ordering="sequentially"> <set> <objectAnimator android:propertyName="x" android:duration="500" android:valueTo="400" android:valueType="intType"/> <objectAnimator android:propertyName="y" android:duration="500" android:valueTo="300" android:valueType="intType"/> </set> <objectAnimator android:propertyName="alpha" android:duration="500" android:valueTo="1f"/> </set>
代码清单5-2
为了执行这个动画,你必须inflate这个XML资源到你的代码中,然后设置目标对象,如代码清单5-3所示:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
set.setTarget(myObject);
set.start();
代码清单5-3
更详细的内容,可以参考simples中的例子,后面将图形与动画章节时,我们会在提到属性动画。
5.1.2 View动画
View动画分为渐变动画和帧动画。网络上有非常多的例子,很多人也用过,这里不再赘述,说一下几个细节。位移动画除了直接使用数字坐标外,还可以使用%p这样的格式,如android:fromYDelta=5%p
%表示相对于自己,%p表示现对于父类。还有一个android:interpolator属性,默认这个属性不是匀速的,所以有些人遇到一直播放的旋转动画,总是不连贯,在某处停顿一下。这是因为加速器没有设置为匀速。请参考一下表格
Interpolator类 |
Resource ID |
AccelerateDecelerateInterpolator |
@android:anim/accelerate_decelerate_interpolator |
AccelerateInterpolator |
@android:anim/accelerate_interpolator |
AnticipateInterpolator |
@android:anim/anticipate_interpolator |
AnticipateOvershootInterpolator |
@android:anim/anticipate_overshoot_interpolator |
BounceInterpolator |
@android:anim/bounce_interpolator |
CycleInterpolator |
@android:anim/cycle_interpolator |
DecelerateInterpolator |
@android:anim/decelerate_interpolator |
LinearInterpolator |
@android:anim/linear_interpolator |
OvershootInterpolator |
@android:anim/overshoot_interpolator |
关于帧动画,一个需要注意的地方就是AnimationDrawable.stop()方法,当你的帧动画只播放一次时,如果需要再次播放,请先调用stop()方法,在调用start()方法,不然你一直调用start()方法是无效的,它不会播放。
5.2 颜色状态列表
一个ColorStateList你可以在XML中定义并且作一个color来使用的对象,但实际上它会根据所使用它的View对象的状态改变颜色。例如,一个Button控件可以存在几种不同的状态(press压,focused获得焦点,或niether常态),此时使用ColorStateList,就可以跟据每个状态提供不同的颜色值来显示。您可以在一个XML文件中,把每种颜色被定义在一个单独的<selector> 标签内的<item> 标记里面。每个<item> 可使用各种属性来描述其对应的状态。在每个状态变化时,状态列表将从上到下,找到第一个符合当前的状态将就会被用上。也就是说,并不是基于用“最佳匹配”的算法来选择的,而仅仅遇到第一个符合最低标准的就会被使用。
注:如果你想提供一个静态的色彩资源,就用一个简单的Color值。即color.xml中。下面让我们看一下代码清单5-4的语法:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:color="hex_color" android:state_pressed=["true" | "false"] android:state_focused=["true" | "false"] android:state_selected=["true" | "false"] android:state_checkable=["true" | "false"] android:state_checked=["true" | "false"] android:state_enabled=["true" | "false"] android:state_window_focused=["true" | "false"] /> </selector>
代码清单5-4
标签:
<selector>
必需的。这个必须是根元素,包含一个或多个<item>。
属性:
xmlns:android
String类型。必需的。用于定义xml的命名空间。其值为:
"http://schemas.android.com/apk/res/android" 。
<item>
定义颜色的,就是根据你想处理的状态使用不同的属性值来显示对应的颜色。必须是<selector>的子元素。
属性:
android:color
十六进制颜色值。必需的。Color用指定RGB值和可选的alpha通道。
其value以“#”号开头,后面跟Alpha-Red-Green-Blue 信息,如下所示:
RGB
ARGB
RRGGBB
AARRGGBB
android:state_pressed
Boolean控件被压(触摸touched/点击clicked)的时候返回true。默认为false。
android:state_focused
Boolean控件获得焦点的时候返回true。默认为false。这里解释一下使用场景,<模拟器容易看到>比如使用滑轮或键盘的方向导航键导航到某一个控件上,则此控件就得到了焦点。当然其它的点击,选择,光标等也都有焦点跟随的。
android:state_selected
Boolean控件被选中的时候返回true。默认为false。比如一个tab被打开。
android:state_checkable
Boolean控件处于可选状态的时候返回true。默认为false。说明,这个属性和下面的checked属性仅仅用于那些在可选和不可选两种状态当中过渡的控件。
android:state_checked
Boolean控件被选中的时候返回true。默认为false。
android:state_enabled
Boolean控件可用的时候返回true。默认为false。
android:state_window_focused
Boolean当应用的窗口处于聚焦状态时返回true,当窗口失去焦点时返回false(就是说应用窗口处于前台时返回true,处于后台返回false。比如通知罩(即通知栏被拉下后的半透时界面)被打开时或者一个对话框(dialog)出现的时候。后面的窗口就处于失焦状态。
注意:请记住,在状态列表的第一项的会被直接应用到当前状态。因此如果第一项没有包含上述状态中对应的状态,才会从上到下进行匹配。 每次都是如此,这也就是为什么default默认状态要写在最末尾的原因。下面让我们看一个实例,如代码清单5-5所示:
XML文件保存在res/color/button_text.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#ffff0000"/> <!-- pressed --> <item android:state_focused="true" android:color="#ff0000ff"/> <!-- focused --> <item android:color="#ff000000"/> <!-- default --> </selector>
代码清单5-5
作用于下面的这个button,如代码清单5-6所示:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button_text" android:textColor="@color/button_text" />
代码清单5-6
5.3 Drawable资源
一个drawable资源,就是能被画到屏幕的一个一般的图形概念,它可以用getDrawable(int)这个API或者将其应用到xml文件资源中,使用android:drawable和android:icon这两个属性
有如下多种图形概态.
Bitmap File
一个位图文件(.png,.jpg,或.gif), 生成一个BitmapDrawable对象.
Nine-Patch File
就是一张可以基于自动适应内容大小而伸缩区域的png图片(.9.png), 生成一个NinePatchDrawable对象
Layer List
这个Drawable用来管理一个其它多个drawable的数组.既然是一个数组,所以就不难理解索引值最大的元素将画在最高部. 生成一个LayerDrawable对象.
State List
这是一个xml文件用于不同的状态来引用不同的位图图形(比如,当一个Button控件按下状态要显示不同的图像)。生成一个StateListDrawable对象.
Level List
一个xml文件,定义了一个drawable可用于管理几个可以替换的drawable.每一个都会分配一个最大的数值.生成一个LevelListDrawable。
Transition Drawable
一个xml文件,定义了一个drawable可用于两张图片形成一个渐变的过渡效果生成一个TransitionDrawable对象
Inset Drawable
一个xml文件,定义了一个drawable,跟据指定的距离插入到另一个drawable.当一个View对象需要一张比其实际边框要小的背景图时,就可以用到这个了.
Clip Drawable
一个xml文件,定义了一个drawable, 根据当前对准值作相应的拉伸处理,生成 ClipDrawable对象.
Scale Drawable
一个xml文件,定义了一个drawable, 根据当前对准值作相应的平铺处理,生成 ScaleDrawable对象.
Shape Drawable
就是通过一个xml文件来定义一个包含颜色和渐变的几何图形, 生成一个 ShapeDrawable对象
注:在xml中一个color resource<颜色资源>也可以作为一个drawable. 例如,创建一个state list drawable时,你可以为android:drawable属性引用一个颜色资源(android:drawable="@color/green").
5.3.1 Bitmap
Android 支持三种格式的位图文件.png(推荐 ), .jpg(可以接受), .gif(不建议使用). 可以直接用文件名来引用一个位图文件,或在xml中为其创建一个资源id的别名.
注意:在编译过程中Bitmap文件可能使用aapt工具优化为无损压缩图像,例如,一个不需要256色的真彩PNG图片可能转化为附有调色板的8-bitPNG图片。这会产生同等质量的图片,但只需要较少的内存。所以需要明白在此路径下的图片在编译中会改变。如果打算按bit流读取图片以转换成位图,把图片放在res/raw/文件夹,这将不会被优化。
1.Bitmap File(位图文件)
一个位图文件就是一个.png, .jpg, 或 .gif文件. 当你把这些文件放在res/drawable/ 中,Android就会为其创建一个 Drawable (可绘制的)资源.
文件位置:
res/drawable/filename.png (.png, .jpg, or .gif)
文件名被用作资源id.
编译后的资源数据类型:
资源将生成一个BitmapDrawable对象.
资源引用:
java: R.drawable.filename
xml: @[package:]drawable/filename
例如:
当一个图片保存在res/drawable/myimage.png ,下面就是xml来使用此图到一个View上,如代码清单5-7所示:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
代码清单5-7
下面的应用代码是将一个图片恢复为一个Drawable对象,如代码清单5-8所示:
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
代码清单5-8
2.XML Bitmap
XML Bitmap是定义在xml文件中,指向一个位图的资源文件.这种作用对于原始的位图文件尤其有效。此XML可以设定抖动,拼接等位图的附加属性。
注意:可以使用<bitmap>成员作为<item>成员的子成员,例如:当创建一个statelist(状态列表)或者layerlist(图层列表),可以从<item>元素中去除android:drawable属性,而在<item>中构建一个<bitmap>来定义此绘制项(drawable item).
文件位置:
res/drawable/filename.xml以此文件名作为标识资源的ID
编译过后的资源数据类型:
一个指向BitmapDrawable的资源指针
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-9所示:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:antialias=["true" | "false"] android:dither=["true" | "false"] android:filter=["true" | "false"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
代码清单5-9
元素:
<bitmap>
定义位图资源和特性。
属性:
xmlns:android:
String. 定义XML的命名空间,必须是:"http://schemas.android.com/apk/res/android",只有当此<bitmap>是一个根元素时才要求,当此<bitmap>是构建在一个<item>中此要求是不必要的。
android:src
可绘制资源,必需项,引用一个可绘制资源。
android:antialias
布尔型,是否允许平滑效果。
android:dither
布尔型,如果位图与屏幕的像素配置不同时,是否允许抖动。(例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565)
android:filter
布尔型。 是否允许对位图进行滤波。对位图进行收缩或者延展使用滤波可以获得平滑的外观效果。
android:gravity
关键字。定义位图的gravity,如果位图小于其容器,使用gravity指明在何处绘制。
取值必须是如下常量值中的一个或多个(以分隔‘|’)
android:tileMode(平铺模式)
关键字。定义平铺模式,当允许平铺模式时,重复位图,忽略gravity设置。 取值必须是如下常量值中的一个:
取值 |
描述 |
desable |
不给位图添加标题,默认值。 |
clamp |
复制边缘的颜色,如果着色超出原来的界限。 |
repeat |
垂直和水平重复着色的图片。 |
mirror |
垂直和水平重复着色的图片,交替镜像图片使得临近的一直衔接。 |
实例,如代码清单5-10所示:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon" android:tileMode="repeat" />
代码清单5-10
5.3.2 Nine-Patch
一个可拉伸图片是一个PNG图片,当View中的图片内容超过了其正常的图片边界时,可以在其中定义供Android缩放的拉伸区域。此类图片常被用于至少有一个维度设置为“wrap_content”的View的背景,View需要扩展自己来适应其内容,而Nine-Patch也会缩放以匹配View的大小。Nine-Patch的一个使用示例就是Android标准Button控件的背景,必须伸缩以适应Button的文字或图片。同正常的位图一样,你可以直接引用一个Nine-Patch文件也可以通过XML定义资源引用。
1.Nine-Patch文件
文件位置:
res/drawable/filename.9.png
使用文件名来标示资源。
编译过的资源数据类型:
资源指针指向一个NinePatchDrawable文件。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
举例: 有一个图片保存在res/drawable/myninepatch.9.png, 此布局XML应用到一个View, 如代码清单5-11所示:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/myninepatch" />
代码清单5-11
2. XML Nine-Patch
一个XML Nine-Patch 是一个定义在XML中,指向一个Nine-Patch文件的资源,此XML能够设置图片的抖动。
文件位置:
res/drawable/filename.xml
使用文件名来标示资源。
编译过的资源数据类型:
资源指针指向一个NinePatchDrawable文件。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-12所示:
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:dither=["true" | "false"] />
代码清单5-12
元素:
<nine-patch>
定义Nine-Patch和其特性
属性:
xmlns:android
字符型,必要的. 定义XML的命名空间,必须是
“http://schemas.android.com/apk/res/android”。
android:src
可绘制资源,必要的,指向一个Nine-Patch文件。
android:dither
布尔型,如果位图与屏幕的像素配置不同时,是否允许抖动.(例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565)。
举例,如代码清单5-13所示:
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/myninepatch" android:dither="false" />
代码清单5-13
5.3.3 Layer list
一个图层是一个管理一系列其他绘图的绘制对象。在列表中的每个可绘制物有序地绘制在列表内,最后一个绘图在最上面。
每个绘图作为一个<item>元素单独地呈现在<layer-list>元素内。
文件位置:
res/drawable/filename.xml
使用文件名来标示资源。
编译过的资源数据类型:
资源指针指向一个LayerDrawable文件。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-14所示:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </layer-list>
代码清单5-14
元素:
<layer-list>
必要的,这个必须是一个根元素,包含了一个或多个<item>元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须是
"http://schemas.android.com/apk/res/android"
<item>
定义一个绘图放在图层里,位置由其属性确定。必须是<selector>的子元素。可接受<bitmap>最为子元素。
属性:
android:drawable
可绘制资源,必须的,引用一个可绘制资源。
android:id
资源ID,此绘图资源唯一的资源ID。为新项创建一个新的资源ID:"@+id/name"。"+"表示新增一个ID。可以使用ID号通过View.findViewById()或者Activity.findViewById()来检索和修改此绘图资源。
android:top
整型,顶上像素偏移。
android:right
整型,右方像素偏移。
android:bottom
整型,底部像素偏移。
android:left
整型,左方像素偏移。
默认情况下所有绘制项目缩放,以适应包含视图的大小。因此,放置图像在图层列表的不同位置,可能会增加View的大小和一些图像需要扩展到合适的大小。为了避免列表中的扩展项,在<item>元素内使用<bitmap>元素,指定可绘制性和定义gravity为不会扩展的属性,诸如“居中”。例如,下面的<item>定义了一个项,扩展到适应其容器View的大小,如代码清单5-15所示:
<item android:drawable="@drawable/image" />
代码清单5-15
为避免扩展,如下的例子使用一个<bitmap> 元素,gravity属性为居中,如代码清单5-16所示:
<item> <bitmap android:src="@drawable/image" android:gravity="center" /> </item>
代码清单5-16
实例:
XML文件保存于res/drawable/layers.xml,如代码清单5-17所示:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:src="@drawable/android_red" android:gravity="center" /> </item> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android_green" android:gravity="center" /> </item> <item android:top="20dp" android:left="20dp"> <bitmap android:src="@drawable/android_blue" android:gravity="center" /> </item> </layer-list>
代码清单5-17
注意这个例子使用gravity属性居中的内嵌<bitmap>元素,来定义每个列表项的绘图资源。由于,图片偏移量引起的尺寸调整,这确保了没有图片需要缩放来适应容器的大小。 把这个XML布局应用到一个View,如代码清单5-18所示:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/layers" />
代码清单5-18
结果是偏移量不断增加的一系列图片的堆叠:
5.3.4 State list
StateListDrawable是一个定义在XML中的可绘制对象,使用几个不同的图像,根据对象的状态来呈现同一个图形。例如,一个Button控件,可以处于几种状态中的一种(按下,聚焦,或都不是)使用状态列表可绘制,可以为每个状态提供不同的背景图像。
可以在XML文件中描述列表,每个图形由一个<item>元素内部有一个单一<selector>元素呈现。每个<item>拥有多个属性来描述应用到可绘制对象的图形的状态。
在每个状态改变期间,状态列表是横跨从顶到底,使用第一个项匹配当前状态,这种选择不是基于最佳匹配,而仅仅是第一个项符合状态的最小标准。
文件位置:
res/drawable/filename.xml
以文件名作为标示资源的ID。
编译后资源数据类型:
资源指针指向一个StateListDrawable。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-19:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize=["true" | "false"] android:dither=["true" | "false"] android:variablePadding=["true" | "false"] > <item
android:drawable="@[package:]drawable/drawable_resource" android:state_pressed=["true" | "false"] android:state_focused=["true" | "false"] android:state_hovered=["true" | "false"] android:state_selected=["true" | "false"] android:state_checkable=["true" | "false"] android:state_checked=["true" | "false"] android:state_enabled=["true" | "false"] android:state_activated=["true" | "false"] android:state_window_focused=["true" | "false"] /> </selector>
代码清单5-19
元素:
<selector>
必要的,这个必须是根元素,包含了一个或多个<item>元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须等于
"http://schemas.android.com/apk/res/android"。
android:constantSize
布尔型。当状态变化时,绘制对象的内部大小保持不变(所有状态的最大值)为"true";如果绘制对象的大小根据当前状态而改变为"false",默认设置为"false"。
android:dither
布尔型,"true",当位图的像素配置与屏幕的不一致时,允许位图抖动(例如,一个ARGB 8888 的位图和一个RGB 565 的屏幕);"false",不允许抖动,默认设置为"false"。
android:variablePadding
布尔型,为"true"时,根据所选择的当前状态,可绘制对象的填充需要改变;为"false"时,填充保持不变(所有状态的填充最大值)。使用此特性要求当状态改变时处理好布局,它会常常不支持。默认设置为"false"。
<item>
定义一个可应用在一定状态的绘制对象,属性由其描述所定,必须是<selector>的子元素。
属性:
android:drawable
可绘制资源,必要的,引用一个可绘制资源。
android:state_pressed
布尔型,为"true"时,当对象被按下(诸如触摸/单机一个按钮)使用此选项;为"false"时,默认设置应当使用此选项,处于没有按下状态。
android:state_focused
布尔型,为"true"时,当对象拥有输入焦点时应使用此选项(诸如当用户选择一个文本输入);为"false"时,默认设置使用此选项,处于没有焦点状态。
android:state_hovered
布尔型,为"true"时,当对象处于游标徘徊在附近时,使用此选项;"false"时,默认使用此选项,处于没有游标徘徊状态。通常,这种绘制对象与聚焦状态的绘制对象相同。
API 14 中有介绍。
android:state_selected
布尔型,为'true"时,当对象是当前用户通过方向控制键导航选择选项(诸如通过一个十字键列表导航),使用此选项;为"false"时,当对象没有被选中时,使用此选项。
当聚焦不够用时使用此选择状态(诸如当列表视图拥有聚焦而使用十字键选择一个选项时)。
android:state_checkable
布尔型,为"true"时,对象是是可核对的;为"false"时,对象不可核对的。(只当对象可以在可核对与不可核对控件间变换时使用)
android:state_enabled
布尔型,为 "true"时,对象许可(能够接受到触摸或单击事件);为"false"时,对象不许可。
android:state_activated
布尔型,为"true"时,由于持久的选择使对象处于激活状态,(诸如在一种持久的导航视图中高亮标示列表选项);为"false"时,对象没有处于激活状态。
详细介绍在API11
android:state_window_focused
布尔型,为"true"时,焦点在应用的窗口(此应用处于前台),此应用的窗口没有获得焦点(例如当有通知栏拉下或对话出现)
注意:记住Adroid在状态列表中使用第一个选项以匹配对象的当前状态。所以,如果列表中第一个选项不包含任一个的状态属性,此时它就会每次都使用第一个选项,这也是为什么要把默认属性放在最后面的原因。(如下面的示例所示)
例子: XML 文件保存于res/drawable/button.xml,如代码清单5-20所示:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_pressed" /> <!-- pressed --> <item android:state_focused="true" android:drawable="@drawable/button_focused" /> <!-- focused --> <item android:state_hovered="true" android:drawable="@drawable/button_focused" /> <!-- hovered --> <item android:drawable="@drawable/button_normal" /> <!-- default --> </selector>
代码清单5-20
把此布局应用到一个按钮的可绘制状态列中,如代码清单5-21所示:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/button" />
代码清单5-21
5.3.5 Level list
一个可绘制对象管理许多可相互替换的可绘制对象,每个都标示了最大数值。使用setLevel()设置可绘制资源的级别,在级别列表中装载可绘制资源,此列表有个android:maxLevel 值,此值大于或等于方法传递给setLevel()方法的值。
文件位置:
res/drawable/filename.xml
文件名作为资源ID。
编译后的资源数据类型:
指向一个LevelListDrawable的资源。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-22所示:
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/drawable_resource" android:maxLevel="integer" android:minLevel="integer" /> </level-list>
代码清单5-22
元素:
<level-list>
此必须是根元素,包含一个或多个<item>元素。
xmlns:android
字符型,必要的,定义XML的命名空间,必须是
"http://schemas.android.com/apk/res/android".
<item>
在某级别上定义一个可绘制的对象。
属性:
android:drawable
可绘制资源,必要的,引用一个可绘制资源来插入。
android:maxLevel
整型,允许的级别最大值
android:minLevel
整型,允许的级别最小值
举例,如代码清单5-23所示:
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/status_off" android:maxLevel="0" /> <item android:drawable="@drawable/status_on" android:maxLevel="1" /> </level-list>
代码清单5-23
一旦把此应用到一个视图上,此等级值可以通过setLevel() 或 setImageLevel()修改
5.3.6 Transition Drawable
一个变换Drawable是一个可绘制对象,在两个可绘制资源间能够同时淡入淡出。 每个可绘制对象由在单独的<transition>元素中的<item>元素表示。至多支持两个选项。前向过渡使用startTransition(),后向使用 reverseTransition()。
文件位置:
res/drawable/filename.xml
文件名作为资源ID。
编译后的资源数据类型:
指向一个变换Drawable的资源。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-24所示:
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </transition>
代码清单5-24
元素:
<transition>
必要的,这个必须是根元素,包含一个或多个<item>元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须是
"http://schemas.android.com/apk/res/android"。
<item>
定义一个可绘制对象作为此可绘制过度,必须是<transition>元素的子元素。接受<bitmap>子元素。
属性:
android:drawable
可绘制资源,必要的,引用一个可绘制资源。
android:id
必要的ID,此可绘制对象的唯一资源ID。若为此项创建一个新的资源ID,使用 "@+id/name"。加号表示应当创建一个新的ID。可以使用此符号通过View.findViewById()或者Activity.findViewById()来显示和修改此绘制对象。
android:top
整型,像素的上方偏移量。
android:right
整型,像素的右边偏移量。
android:bottom
整型,像素的下方偏移量。
android:left
整型,像素的左边偏移量。
举例:
XML文件保存于res/drawable/transition.xml,如代码清单5-25所示:
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/on" /> <item android:drawable="@drawable/off" /> </transition>
代码清单5-25
把此XML布局应用到试图,如代码清单5-26所示:
<ImageButton android:id="@+id/button" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/transition" />
代码清单5-26
下面的代码实现了从第一项到第二项变换需要500ms,如代码清单5-27所示。
ImageButton button = (ImageButton) findViewById(R.id.button); TransitionDrawable drawable = (TransitionDrawable) button.getDrawable(); drawable.startTransition(500);
代码清单5-27
5.3.7 Inset Drawable
一个定义在XML中的可绘制对象,在指定的距离内插入另外一个可绘制对象。当一个视图的背景小于视图的实际大小时,会用到此。
文件位置:
res/drawable/filename.xml
文件名作为资源ID。
编译后资源数据类型:
资源InsetDrawable指针
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-28所示:
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:insetTop="dimension" android:insetRight="dimension" android:insetBottom="dimension" android:insetLeft="dimension" />
代码清单5-28
元素:
<inset>
定义一个插入drawable。必须是根元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须是
"http://schemas.android.com/apk/res/android"
android:drawable
可绘制资源,必要的,引用一个可绘制资源以插入。
android:insetTop
尺寸,上端插入,作为一个尺寸值或尺寸资源。
android:insetRight
尺寸,右端插入,作为一个尺寸值或尺寸资源。
android:insetBottom
尺寸,底端插入,作为一个尺寸度值或尺寸资源。
android:insetLeft
尺寸,左边插入,作为一个尺寸值或尺寸资源。
举例,如代码清单5-29所示:
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/background" android:insetTop="10dp" android:insetLeft="10dp" />
代码清单5-29
5.3.8 Clip Drawable
根据可绘制对象的当前级别,定义在XML中可绘制对象,可以剪贴另一个可绘制对象。
可以根据当前级别决定以什么样的宽高比裁剪子对象,还有gravity来控制在容器内部的摆放位置。
常用来实现例如进度条的东西。
文件位置:
res/drawable/filename.xml
文件名作为资源ID。
编译后资源数据类型:
资源ClipDrawable指针
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法, 如代码清单5-30所示:
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:clipOrientation=["horizontal" | "vertical"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] />
代码清单5-30
元素:
<clip>
定义剪贴绘制对象,必须是根元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须是"http://schemas.android.com/apk/res/android"。
android:drawable
可绘制资源,必要的,引用一个要剪贴的可绘制资源。
android:clipOrientation
关键字,对剪贴进行定位。
android:gravity
关键字,指定可绘制对象内的剪贴位置。
取值必须是如下常量之一或多个(以“|”分隔):
举例: XML文件保存于 res/drawable/clip.xml,如代码清单5-31所示:
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/android" android:clipOrientation="horizontal" android:gravity="left" />
代码清单5-31
下面的XML布局应用到一个试图的剪贴可绘制资源,如代码清单5-32所示:
<ImageView android:id="@+id/image" android:background="@drawable/clip" android:layout_height="wrap_content" android:layout_width="wrap_content" />
代码清单5-32
如下的代码取得可绘制对象,为了渐进地显示图像增加了剪贴数,如代码清单5-33所示:
ImageView imageview = (ImageView) findViewById(R.id.image); ClipDrawable drawable = (ClipDrawable) imageview.getDrawable(); drawable.setLevel(drawable.getLevel() + 1000);
代码清单5-33
增加级别减少了剪贴数,减慢了显示图像的速度,如下是级别数为7000:
注意:默认级别为0,全部剪贴,图像不可见,当级别是10000,图片没有剪贴,全部可见。
5.3.9 Scale Drawable
一个定义在XML中的可绘制对象,能够依据当前级别改变另一个可绘制对象的大小。
文件位置:
res/drawable/filename.xml
文件名作为资源ID。
编译后数据类型:
指向尺寸Drawable的资源指针。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-34所示:
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] android:scaleHeight="percentage" android:scaleWidth="percentage" />
代码清单5-34
元素:
<scale>
定义尺寸drawable.,必须是根元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须是"http://schemas.android.com/apk/res/android"
android:drawable
可绘制资源,必要的,引用一个可绘制资源。
android:scaleGravity
关键字,指定缩放后的gravity位置
取值必须是如下常量中一个或多个(以“|”分隔):
android:scaleHeight
百分比,高度尺寸,表示可绘制对象的边界百分比,取值以百分比形式,例如:100%,12.5%,等。
android:scaleWidth
百分比,高度尺寸,表示可绘制对象的边界百分比,取值以百分比形式,例如:100%,12.5%,等。
举例,如代码清单5-35所示:
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/logo" android:scaleGravity="center_vertical|center_horizontal" android:scaleHeight="80%" android:scaleWidth="80%" />
代码清单5-35
5.3.10 Shape Drawable
这是一个定义在XML中的通用形状。
文件位置:
res/drawable/filename.xml
文件名作为资源ID。
编译后的资源数据类型:
指向一个渐变Drawable的资源指针。
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable/filename
语法,如代码清单5-36所示:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"] > <corners android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer" /> <gradient android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=["linear" | "radial" | "sweep"] android:useLevel=["true" | "false"] /> <padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer" /> <size android:width="integer" android:height="integer" /> <solid android:color="color" /> <stroke android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer" /> </shape>
代码清单5-36
元素:
<shape>
形状drawable,必须是根元素。
属性:
xmlns:android
字符型,必要的,定义XML的命名空间,必须是
"http://schemas.android.com/apk/res/android"。
android:shape
关键字,定义形状的类型,取值是:
取值 |
描述 |
"rectangle" |
填充包含的视图的矩形,是默认形状。 |
"oval" |
椭圆形,适合包含的视图的尺寸。 |
"line" |
划分包含的视图的水平线,这个形状要求<stroke>元素来定义线的宽度。 |
"ring" |
环形。 |
如下属性只有当android:shape="ring"时才使用。
android:innerRadius
尺寸,内环半径(中间的孔),作为一个尺寸值或尺寸资源。
android:thickness
尺寸,环的厚度,作为一个尺寸值或尺寸资源。
android:thicknessRatio
浮点型,环的厚度比上环的宽度,例如,如果android:thicknessRatio="2",厚度等于环的宽度的1/2,此值被android:innerRadius重写,默认为3.
android:useLevel
布尔型,为"true"时,用于LevelListDrawable,正常情况设为"false",或者形状不出现。
<corners>
为形状创建圆角,只有当形状为矩形时才应用。
属性:
android:radius
尺寸数,所有的角的半径,作为一个尺寸值或尺寸资源,对于每个角会重写如下的属性:
android:topLeftRadius
尺寸数,左上角的半径,作为一个尺寸度值或尺寸资源。
android:topRightRadius
尺寸数,右上角的半径,作为一个尺寸度值或尺寸资源。
android:bottomLeftRadius
尺寸数,左下角的半径,作为一个尺寸值或尺寸度资源。
android:bottomRightRadius
尺寸数,右下角的半径,作为一个尺寸值或尺寸度资源。
注意:每个角的角半径必须大于1,不然没有圆角。如果想指定所有的角都不是圆角,使用android:radius
来设定默认的角半径大于1,然后重写每个角,并指定每个角的半径值为所需要的值,如果不需要圆角,值为0(0dp)。
<gradient>
为形状指定渐变颜色。
属性:
android:angle
整形,渐变的角度,度数,0度为从左到右,90度是从底到上,必须是45度的倍数,默认为0.
android:centerX
浮点型,距离渐变中心的X坐标的相对位置(0 - 1.0)。
android:centerY
浮点型,距离渐变中心的Y坐标的相对位置(0 - 1.0)。
android:centerColor
颜色,可选择开始到结束之间的颜色,作为一个十六进制值或颜色资源。
android:endColor
颜色,结束颜色,作为一个十六进制值或颜色资源。
android:gradientRadius
浮点型,渐变的半径,只有当android:type="radial"才使用
android:startColor
颜色,开始颜色,作为一个十六进制值或者颜色资源。
android:type
关键字,使用的渐变模式,有效值如下:
取值 |
描述 |
linear |
线性渐变,默认选择 |
radial |
辐射渐变,开始颜色也是结束颜色 |
sweep |
卷曲线渐变 |
android:useLevel
布尔型,为"true"时,作为一个 LevelListDrawable。
<padding>
填充以适用于视图元素(填充视图内容的位置而不是形状。
属性:
android:left
尺寸,左边填充,作为一个尺寸值或者尺寸资源。
android:top
尺寸,顶上填充,作为一个尺寸值或者尺寸资源。
android:right
尺寸,右边填充,作为一个尺寸值或者尺寸资源。
android:bottom
尺寸,底边填充,作为一个尺寸值或者尺寸资源。
<size>
形状的大小。
属性:
android:height
尺寸,形状的高,作为一个尺寸值或者尺寸资源。
android:width
尺寸,形状的宽,作为一个尺寸值或者尺寸资源。
注意:形状缩放大小以适应视图,与定义的尺寸相称,默认,当在一个图像视图使用形状时,可以限制缩放,通过设置 android:scaleType to "center"。
<solid>
固定颜色填充形状。
属性:
android:color
颜色,用到形状上的颜色,作为一个十六进制值或颜色资源。
<stroke>
形状的笔触。
属性:
android:width
尺寸,线的宽度,作为一个尺寸值或尺寸资源。
android:color
颜色,线的颜色,作为一个十六进制值或者颜色资源。
android:dashGap
尺寸,虚线间隔,作为一个尺寸值或尺寸资源,只有当设置android:dashWidth才有效。
android:dashWidth
尺寸,每个虚线的大小,作为一个尺寸值或尺寸资源,只有当设置android:dashGap才有效。
例子:
XML文件存于res/drawable/gradient_box.xml,如代码清单5-37所示:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="45"/> <padding android:left="7dp" android:top="7dp" android:right="7dp" android:bottom="7dp" /> <corners android:radius="8dp" /> </shape>
代码清单5-37
把此XML布局应用到一个视图的形状drawable,如代码清单5-38所示:
<TextView android:background="@drawable/gradient_box" android:layout_height="wrap_content" android:layout_width="wrap_content" />
代码清单5-38
应用程序代码获得形状drawable,应用到视图,如代码清单5-39所示:
Resources res = getResources(); Drawable shape = res. getDrawable(R.drawable.gradient_box); TextView tv = (TextView)findViewByID(R.id.textview); tv.setBackground(shape);
代码清单5-39
5.4 菜单资源
一个菜单资源定义了一个应用程序菜单(选项菜单,上下文菜单或子菜单),可以与MenuInflater配合使用。
文件的位置:
res/menu/filename.xml
文件名将被用作资源ID。
编译的资源数据类型:
资源指针到菜单(或子类)的资源。
资源参考:
Java: R.menu.filename In XML:@[package:]menu.filename
XML: @[package:]menu.filename
语法,如代码清单5-40所示:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@[+][package:]id/resource_name" android:title="string" android:titleCondensed="string" android:icon="@[package:]drawable/drawable_resource_name" android:onClick="method name" android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"] android:actionLayout="@[package:]layout/layout_resource_name" android:actionViewClass="class name" android:actionProviderClass="class name" android:alphabeticShortcut="string" android:numericShortcut="string" android:checkable=["true" | "false"] android:visible=["true" | "false"] android:enabled=["true" | "false"] android:menuCategory=["container" | "system" | "secondary" | "alternative"] android:orderInCategory="integer" /> <group android:id="@[+][package:]id/resource name" android:checkableBehavior=["none" | "all" | "single"] android:visible=["true" | "false"] android:enabled=["true" | "false"] android:menuCategory=["container" | "system" | "secondary" | "alternative"] android:orderInCategory="integer" > <item /> </group> <item > <menu> <item /> </menu> </item> </menu>
代码清单5-40
元素:
<menu>
需要。这必须是根节点。包含的<item> /或 <group>的元素。
属性:
xmlns:android
XML命名空间。必需的。定义XML命名空间,它必须
是"http://schemas.android.com/apk/res/android"。
<item>
一个菜单项。可能包含<menu>的元素(子菜单)。必须有一个<menu>或<group>元素。
属性:
android:id
资源ID。独特的资源ID。此项目创建一个新的资源ID,使用的形式:"@+id/ name "。
加符号表示,这应该被视为一个新的ID创建的。
android:title
字符串资源。作为一个字符串资源或原始字符串的菜单标题。
android:titleCondensed
字符串资源。一个简明标题作为一个字符串资源或原始字符串。
是用于正常的标题过长的情况下,这个称号。
android:icon
绘制的资源。菜单项图标的图像。
android:onClick
方法的名称。这个菜单项被点击时要调用的方法。该方法必须声明为公共Activity和接受的MenuItem作为其唯一的参数,这表明该项目点击。这种方法比标准的回调到,优先onOptionsItemSelected()。看到在底部的例子。
注意:如果您使用ProGuard(或类似的工具)混淆您的代码,可以肯定你指定的类名肯定被重命名了,它可以破坏这个功能。
android:showAsAction
关键字。何时以及如何一个动作项显示在动作栏。当一个Activity界面包含ActionBar(API等级11引入),一个菜单项能作为动作项出现。有效值:
值 |
描述 |
ifRoom |
如果有足够的空间,这个值会使菜单项显示在Action Bar上。 |
withText |
分开 |
never |
这个值使菜单项永远都不出现在Action Bar上 |
always |
在操作栏中,始终显示这个项目。避免使用,除非该项目总是出现在操作栏中,它的关键。设置多个项目总是出现行动项目可能会导致他们与其他UI在操作栏重叠。 |
collapseActionView |
认为这个行动项目(如宣布相关的android:actionLayout或android:actionViewClass)的行动是可折叠的。API等级14介绍。 |
android:actionLayout
布局资源。使用动作视图布局。API等级11引入
android:actionViewClass
类的名称。为完全合格的类名作为行动视图查看使用。例如,
"android.widget.SearchView" 使用搜索查看作为一个动作视图。
注意:如果您使用ProGuard(或类似的工具)混淆您的代码,可以肯定你指定的类名肯定被重命名了,它可以破坏这个功能。API等级11引入
android:actionProviderClass
类的名称。例如,"android.widget.ShareActionProvider"使用ShareActionProvider
注意:如果您使用ProGuard(或类似的工具)混淆您的代码,可以肯定你指定的类名肯定被重命名了,它可以破坏这个功能。API等级14引入
android:alphabeticShortcut
字符。一个字符为字母快捷键。
android:numericShortcut
整数。一些数字快捷键。
android:checkable
布尔。“真”,如果该项目是检验的。
android:checked
布尔。“真”,如果该项目被默认选中。
android:visible
布尔。“真”,如果该项目是默认可见。
android:enabled
布尔。“真”,如果该项目是默认启用的。
android:menuCategory
关键字。相应的菜单 CATEGORY_ * 常量,它定义了该项目的优先级值。有效值:
值 |
描述 |
container |
项目是容器的一部分 |
system |
对于系统提供的项目 |
secondary |
对于项目的用户提供二次选项(很少使用) |
alternative |
项目,是对当前显示的数据替代行动 |
android:orderInCategory
整数。该项目的“重要性”的顺序,一个组内。
<group>
菜单组(创建一个共享的特征,如他们是否是可见的,启用,或托运的物品的集合)。包含一个或多个的<item>元素。必须一个子<menu>元素。
属性:
android:id
资源ID。独特的资源ID。此项目创建一个新的资源ID,使用的形式:"@+id/name"。加符号表示,这应该被视为一个新的ID创建的。
android:checkableBehavior
关键字。组托运的行为类型。有效值:
值 |
描述 |
none |
不可检查 |
all |
可以检查所有项目(使用复选框) |
single |
只有一个项目可以检查(使用单选按钮) |
android:visible
布尔。如果组是可见的“真实”。
android:enabled
布尔。“真”,如果该组已启用。
android:menuCategory
关键字。相应的菜单 CATEGORY_ * 常量,它定义组的优先级值。有效值:
值 |
描述 |
container |
团体是一个容器的一部分 |
system |
对于系统提供的组 |
secondary |
对于群体的用户提供二次选项(很少使用) |
alternative |
团体,是对当前显示的数据替代action |
android:orderInCategory
整数。默认类别内的项目顺序。
例如:XML文件保存在 res/menu/example_menu.xml,如代码清单5-41所示:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item1" android:title="@string/item1" android:icon="@drawable/group_item1_icon" android:showAsAction="ifRoom|withText"/> <group android:id="@+id/group"> <item android:id="@+id/group_item1" android:onClick="onGroupItemClick" android:title="@string/group_item1" android:icon="@drawable/group_item1_icon" /> <item android:id="@+id/group_item2" android:onClick="onGroupItemClick" android:title="@string/group_item2" android:icon="@drawable/group_item2_icon" /> </group> <item android:id="@+id/submenu" android:title="@string/submenu_title" android:showAsAction="ifRoom|withText" > <menu> <item android:id="@+id/submenu_item1" android:title="@string/submenu_item1" /> </menu> </item> </menu>
代码清单5-41
下面的应用程序代码膨胀从菜单onCreateOptionsMenu(菜单)回调,也定义了按钮回调两个项目,如代码清单5-42所示:
public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.example_menu, menu); return true; } public void onGroupItemClick(MenuItem item) { // 所有其他菜单item处理可以通过onOptionsItemSelected() }
代码清单5-42
注:android:showAsAction仅适用于的Android 3.0(API等级11)和以上。
5.5 字符串资源
字符串资源为应用程序提供可选样式和格式的文本字符串。应用程序可以使用三种类型的字符串资源:
String
提供了一个字符串的XML资源。
String Array
提供了一个字符串数组的资源。
Quantity Strings (Plurals)
提供同一个单词或者词组不固定重复组成的字符串资源
5.5.1 String
单个字符串可以被应用程序或者其它资源文件(如XML布局文件)引用。
注意:单个字符串资源是只能通过提供的name属性(而不是XML文件名)进行引用。所以,在一个XML文件中,可以在
<resource>元素下组合引用字符串和其他简单资源。
文件位置:
res/values/filename.xml
filename文件名是可以自定义的。<string>元素的name属性值会被用作资源的ID号。
编译资源数据类型:
指向字符串的资源指针。
资源引用:
JAVA:R.string.string_name
XML:@string/string_name
语法,如代码清单5-43所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name" >text_string</string> </resources>
代码清单5-43
元素:
<resources>
必须定义的。必须是根节点。没有属性值。
<string>
一个字符串,可以包含样式标签。
属性:
name
字符串。标识字符串的名字。这个名字将被用作资源ID.
例子:
XML文件保存为res/values/strings.xml,如代码清单5-44所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources>
代码清单5-44
XML布局文件把字符串应用到一个视图中, 如代码清单5-45所示:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />
代码清单5-45
应用程序通过以下代码返回一个字符串, 如代码清单5-46所示:
String string = getString(R.string.hello);
代码清单5-46
可以通过getString(int)或者getText(int)取回一个字符串。 getText(int)将保留所有应用到字符串的文本样式。
5.5.2 String Array
由可以被应用程序引用的字符串组成的数组
注意:字符串数组是只能通过提供的name属性(而不是XML文件名)进行引用的简单资源。所以,在一个XML文件中,可以在<resource>元素下组合引用字符串和其他简单资源。
文件定位:
res/values/filename.xml
filename文件名是可以自定义的。<string-array>元素的name属性值会被用作资源的ID号。
编译资源数据类型:
指向字符串数组的资源指针。
资源引用:
JAVA:R.string.string_array_name
语法, 如代码清单5-47所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item >text_string</item> </string-array> </resources>
代码清单5-47
元素:
<resources>
必须定义的。必须是根节点。没有属性值。
<string-array>
定义一个字符串数组,可以包含一个或多个<item>标签。
属性:
name
字符串。标识字符串数组的名字。这个名字将被用作该数组的资源ID.
<item>
一个字符串,可以包含样式标签。值可以是对其它字符串资源的引用,必须是<string-array>元素的子元素。没有属性。
例子
XML文件保存为res/values/strings.xml, 如代码清单5-48所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources>
代码清单5-48
应用程序通过代码返回字符串数组, 如代码清单5-49所示:
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
代码清单5-49
5.5.3 大量 Strings
不同的语言对数量进行描述的语法规则也不同。比如在英语里,数量1是个特殊情况,我们写成“1 book”,但其他任何数量都要写成“n books”。这种单复数之间的区别是很普遍的,不过其他语言会有更好的区分方式。Android支持的全集包括zero、one、 two、few、many和other。决定选择和使用某种语言和复数的规则是非常复杂的,所以Android提供了诸如getQuantityString()的方法来选择合适的资源。
注意,要按照语法规则来建立可选项。在英语里,即使数量为0,字符串零(zero)也不需要建立。因为0在英语语法表达上和2没有区别,和其他除1以外的任何数字都没有差别("zero books", "one book", "two books",等等)。 不要被“two听起来似乎只能用于数量2” 之类的事误导。某语言可能需要2、12、102和1一样形式表示,而又与其他数的形式都不同。
如果和应用程序的风格一致,常可以用诸如“Books: 1”的模糊数量形式来避免使用数量字符串。
注意:复数字符串是只能通过提供的name属性(而不是XML文件名)进行引用的简单类型资源。所以,在一个XML文件中,可以在<resource>元素下组合引用字符串和其他简单资源。
文件定位:
res/values/filename.xml
filename文件名是可以自定义的。<plurals>元素的name属性值会被用作资源的ID号。
资源引用:
在JAVA文件中:R.plurals.plural_name
语法,如代码清单5-50所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="plural_name"> <item quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources>
代码清单5-50
元素:
<resources>
必须定义的。必须是根节点。没有属性值。
<plurals>
一个字符串集,每个数量表示提供一个字符串。可以包含一个或多个<item>标签。
属性:
name
字符串。标识字符串集的名字。这个名字将被用作该数组的资源ID.
<item>
一个单数或复数形式的字符串。可以是对其他字符串资源的引用。必须是<plurals>元素的子元素。
属性:
quantity
关键字。 表示要使用此字符串的数量值。以下是合法的值(括号内列出部分语言要求):
Class/Interface |
描述 |
zero |
语言需要对数字0进行特殊处理。(比如阿拉伯语) |
one |
语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于 此类型。) |
two |
语言需要对类似2的数字进行特殊处理。(比如威尔士语) |
few |
语言需要对较小数字进行特殊处理(比如捷克语里的2、3、4;或者波兰语里以2、3、4结尾但不是12、13、14的数。) |
many |
语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数) |
other |
语言不需要对数字进行特殊处理。 |
例子,如代码清单5-51所示:
XML文件保存为res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">One song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources>
代码清单5-51
XML文件保存为res/values-pl/strings.xml,如代码清单5-52所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">Znaleziono jedną piosenkę.</item> <item quantity="few">Znaleziono %d piosenki.</item> <item quantity="other">Znaleziono %d piosenek.</item> </plurals> </resources>
代码清单5-52
JAVA代码,如代码清单5-53所示:
int count = getNumberOfsongsAvailable(); Resources res = getResources(); String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);
代码清单5-53
在使用getQuantityString()方法时,如果字符串包含数字格式化串,则需要传递2个count参数。例如:对于字符串“%d songs found”,第一个count参数选择合适的复数字符串,第二个count参数插入占位符%d中。如果复数字符串资源不包含格式化信息,就不需要给getQuantityString()传递第三个参数。
5.5.4 Formatting和Styling
下面是关于字符串资源格式化和样式应该了解的比较重要的地方。
省略号和引号的转义
如果字符串里包含撇号或引号,必须进行转义,或者把整个串封闭在与当前引号不同的成对的引号内。下面是一些有效或无效的字符串示例,如代码清单5-54所示:
<string name="good_example">"This'll work"</string> <string name="good_example_2">This\'ll also work</string> <string name="bad_example">This doesn't work</string> <string name="bad_example_2">XML encodings don't work</string>
代码清单5-54
1.字符串的格式化
如果需要使用String.format(String, Object...)。格式化字符串,可以把格式化参数放在字符串(string)资源里。比如存在以下资源,如代码清单5-55所示:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
代码清单5-55
此例中存在两个参数:%1$s是个字符串,%2$d 是个数字,在应用程序中可以用如下方式用参数来格式化字符串,如代码清单5-56所示:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
代码清单5-56
2.用HTML标记来样式化
可以用HTML 标记来为字符串加入样式。如代码清单5-57所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources>
代码清单5-57
支持以下HTML元素:
◆<b>文本加粗bold。
◆<i>文本变斜体italic。
◆<u>文本加下划线underline。
有时可能要创建一个样式化的文本资源,并可作为格式化串使用。通常这不能生效,因为String.format(String,Object...)方法会去除字符串内的所有的样式信息。解决方法是写入一段转义后的HTML标记,然后在格式化后再用fromHtml(String)恢复出这些样式。例如:
将样式化的文本资源存储为转义后的HTML字符串,如代码清单5-58所示:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
代码清单5-58
在这个格式化字符串里,加入了一个元素。注意左尖括号是用标记<转义过的HTML。
按照通常方式格式化字符串,并调用fromHtml(String)把HTML文本转换成带样式的文本,如代码清单5-59所示:
Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); CharSequence styledText = Html.fromHtml(text);
代码清单5-59
因为fromHtml(String)方法会格式化所有的HTML内容,所以要确保用htmlEncode(String)对带格式化文本的字符串内所有可能的HTML字符进行转义。比如,如果要把可能包含诸如“<”或“&”等字符的串作为参数传给String.format(),那么在格式化之前必须对这些字符进行转义。格式化之后再把字符串传入fromHtml(String),这些特殊字符就能还原成本来意义了,如代码清单5-60所示:
String escapedUsername = TextUtil.htmlEncode(username); Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount); CharSequence styledText = Html.fromHtml(text);
代码清单5-60
5.6 样式(Style)
一个样式资源定义了格式并寻找一个UI。一个样式能被应用到个别的View中或者整个Activity或应用程序中。更多关于创建和应用风格的实例,我们在上一篇的(11章 样式和主题)中已经讲述。注意:一个样式一个简单的通过name属性来引用的资源。所以你可以在一个XML文件中结合样式资源和其他简单的资源,只要在<resources>节点下即可。
文件位置:
res/values/filename.xml
文件名任意。
资源引用:
XML: @[package:]style/style_name
语法,如代码清单5-61所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="style_name" parent="@[package:]style/style_to_inherit"> <item name="[package:]style_property_name" >style_value</item> </style> </resources>
代码清单5-61
节点:
<resources>
必须的。这是一个根节点。没有属性
<style>
定义一个单一的样式。包含<item>节点
属性:
name
String。必须的。作为样式的一个名字,由View,Activity或应用程序来引用。
parent
样式资源。从一个继承的样式属性中引用一个样式
<item>
定义一个单一的样式属性。必须是<style>节点的子节点。
属性:
name
属性资源。必须的。这个名字的样式属性将被定义,用一个包的前缀是个不错的选择。(例如android:textColor)。
实例:
样式的XML文件(保存在res/values/下),如代码清单5-62所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomText" parent="@style/Text"> <item name="android:textSize">20sp</item> <item name="android:textColor">#008</item> </style> </resources>
代码清单5-62
XML文件应用样式到TextView中 (保存在res/layout/下),如代码清单5-63所示:
<?xml version="1.0" encoding="utf-8"?> <TextView style="@style/CustomText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello, World!" />
代码清单5-63
5.7 更多资源类型
这个页面定义了更多可以外部化的资源类型,包括:
Bool(布尔)
XML资源,承载布尔值
Color (颜色)
XML资源,承载颜色值(一个16进制的颜色)
Dimension(尺码)
XML资源,承载尺码值 (带有一个度量单位)
ID
XML资源,为程序资源和组件提供一个唯一的标识
Integer
XML资源,承载一个整形值
Integer Array
XML资源,承载一个整形数组
Typed Array
XML资源,提供一个TypedArray (你可以将这个TypedArray作为一个drawables数组)
5.7.1 Bool
在XML中定义一个布尔值。
注意:bool是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将bool资源与其他简单的资源放在一个XML文件中的元素里。
文件位置:
res/values/filename.xml
文件名是任意的。< bool >元素的名称name将用作资源ID。
资源引用:
Java: R.bool.bool_name
XML: @[package:]bool/bool_name
语法,如代码清单5-64所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="bool_name" >[true | false]</bool> </resources>
代码清单5-64
元素:
<resources>
必须,而且必须是根节点。没有属性。
Bool
值:true或false。
属性:
name
类型为String字符串。一个bool值的名称。该名称将用作资源ID。
例如,XML文件保存在 res/values-small/bools.xml,如代码清单5-65所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="screen_small">true</bool> <bool name="adjust_view_bounds">true</bool> </resources>
代码清单5-65
5.7.2 Color
在XML中定义一个颜色值。颜色被指定为RGB值和alpha通道。你可以在任何地方使用color资源,只要它接受十六进制的颜色值表示。当XML文件需要drawable资源时,也可以使用color资源(例如,android:drawable="@color/green")。
值通常以#字符开头,接着Alpha-Red-Green-Blue(阿尔法-红-绿-蓝)信息,以下面的某种格式:
#RGB
#ARGB
#RRGGBB
#AARRGGBB
注意:color是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将color资源与其他简单的资源放在一个XML文件中的元素里。
文件位置:
res/values/colors.xml
文件名任意。<color>节点的名字将被用于资源ID。
资源应用:
Java: R.color.color_name
XML: @[package:]color/color_name
语法,如代码清单5-66所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="color_name" >hex_color</color> </resources>
代码清单5-66
节点:
<resources>
必须的。这个必须的根节点。没有属性
<color>
一种用十六进制表示的颜色,如上所述
属性:
name
String。一个颜色的名字。它将被用于资源ID。
例如,XML文件保存在res/values/colors.xml,如代码清单5-67所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <color name="translucent_red">#80ff0000</color> </resources>
代码清单5-67
这个应用程序代码检索资源的颜色,如代码禽蛋5-68所示:
Resources res = getResources(); int color = res.getColor(R.color.opaque_red);
代码清单5-68
这个布局的XML应用颜色属性到TextView中,5-69所示:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@color/translucent_red" android:text="Hello"/>
代码清单5-69
5.7.3 Dimension
一个dimension值定义在XML中。一个dimension通过一定数量的计量单位指定。 例如: 10px, 2in, 5sp. 以下测量单位是android支持的:
dp
Density-independent Pixels (分辨率无关的像素) - 基于屏幕上的物理密度的抽象单位。这些单位是相对于一个160 DPI(点每英寸)屏幕,其中1DP是大致相等为1px。在分辨率较高的屏幕上运行时,绘制1dp的像素数量按比例扩大, 扩大基于屏幕的dpi。同样,在分辨率较低的屏幕上时,1DP使用的像素数缩减。 dp-to-pixel的比例会随屏幕分辨率改变,但不一定成正比。使用dp单位(而不是像素单位),是一个简单的解决方案,以使你的布局调整大小视图的尺寸适应不同的屏幕分辨率。换句话说,它为不同设备上的UI元素提供了一致的真实大小。
sp
Scale-independent Pixels(大小无关的像素)- 这个和dp单位很像, 但是它基于用户的字体大小偏爱来调整。当指定字体大小时, 推荐你使用这种单位,所以他们为屏幕分辨率和用户偏爱来调整。
pt
Points - 1/72英寸基于物理尺寸的屏幕。
px
Pixels(像素)对应于屏幕上的实际像素。这个测量单位以并不推荐,因为实际的显示可能在不同设备;每个设备可能有不同数量的像素,可能有更多或者更少的像素点在屏幕上可见。
mm
Millimeters(毫米)-基于物理屏幕的大小。
in
Inches(英寸)- 基于物理屏幕的大小。
注意:dimension是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将dimension资源与其他简单的资源放在一个XML文件中的<resources>元素里。
文件位置:
res/values/filename.xml
文件名是任意的。元素的名称将用作资源ID。
资源引用:
Java: R.dimen.dimension_name
XML: @[package:]dimen/dimension_name
语法, 如代码清单5-70所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="dimension_name" >dimension</dimen> </resources>
代码清单5-70
元素:
<resources>
必须的。必要的根节点,没有属性
<dimen>
一个dimension,通过一个float表示,可以使用以下单位(dp, sp, pt, px, mm, in)
属性:
name
Stringdimension的名字,被用做资源ID
例如,XML文件保存在res/values/dimens.xml下,如代码清单5-71所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="textview_height">25dp</dimen> <dimen name="textview_width">150dp</dimen> <dimen name="ball_radius">30dp</dimen> <dimen name="font_size">16sp</dimen> </resources>
代码清单5-71
应用程序代码检索一个dimension,如代码清单5-72所示:
Resources res = getResources(); float fontSize = res.getDimension(R.dimen.font_size);
代码清单5-72
这个布局的XML文件应用dimensions属性,如代码清单5-73所示:
<TextView android:layout_height="@dimen/textview_height" android:layout_width="@dimen/textview_width" android:textSize="@dimen/font_size"/>
代码清单5-73
5.7.4 ID
XML中定义的一个唯一的资源。使用你在元素中提供的name,Android开发工具在项目中的R.java类里创建一个唯一的整数,你可以使用它作为应用程序资源的标识符(例如,在你的UI布局中的View)或一个唯一的整数,用在你的程序代码中(例如,作为一个对话框的ID或result代码)。注意:ID是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将dimension资源与其他简单的资源放在一个XML文件中的元素里,并在<resources>节点下。同样,记住,ID资源并不是引用一个真实的资源项;它仅仅是一个唯一的ID你可以附加到其他资源,或者当作你程序中的唯一整数。
文件位置:
res/values/filename.xml
文件名任意
资源引用:
Java: R.id.name
XML: @[package:]id/name
语法,如代码清单5-74所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <item type="id" name="id_name" /> </resources>
代码清单5-74
例如,XML文件保存在res/values/ids.xml,如代码清单5-75所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <item type="id" name="button_ok" /> <item type="id" name="dialog_exit" /> </resources>
代码清单5-75
然后,这个layout布局文件的片段用"button_ok"作为一个Button窗体的ID,如代码清单5-76所示:
<Button android:id="@id/button_ok" style="@style/button_style" />
代码清单5-76
注意,android:id值在id引用中不包括加号,因为id已经存在,在上面的ids.xml例子中定义了。(当你为一个XML资源指定一个ID,使用加上加号——用格式 android:id="@+id/name"——意味着“name”ID是不存在的,应该被创建)。
另一个例子,下面的代码片段使用“dialog_exit“ID作为一个对话框的惟一标识符: showDialog(R.id.dialog_exit) ,如代码清单5-77所示:
showDialog(R.id.dialog_exit);
代码清单5-77
在同一个应用程序中,当创建一个对话框时“dialog_exit“ID用来对比,如代码清单5-78所示:
protected Dialog onCreateDialog(int)(int id) { Dialog dialog; switch(id) { case R.id.dialog_exit: ... break; default: dialog = null; } return dialog; }
代码清单5-78
5.7.5 Integer
定义在XML中的整数。
注意:integer是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将integer资源与其他简单的资源放在一个XML文件中的元素里。
文件位置:
res/values/filename.xml
文件名任意。<integer> 元素的name将被用做资源ID。
资源引用:
Java: R.integer.integer_name
XML: @[package:]integer/integer_name
语法,如代码清单5-79所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <integer name="integer_name" >integer</integer> </resources>
代码清单5-79
元素:
<resources>
必须。根节点,无属性。
<integer>
一个integer型值
属性:
name
String。Integer的名字。被用于资源ID
例如,XML文件保存在res/values/integers.xml,如代码清单5-80所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <integer name="max_speed">75</integer> <integer name="min_speed">5</integer> </resources>
代码清单5-80
在应用程序中用代码检索一个整数,如代码清单5-81所示:
Resources res = getResources(); int maxSpeed = res.getInteger(R.integer.max_speed);
代码清单5-81
5.7.6 Integer Array
XML中定义的整型数组
注意:integer array是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将integer array资源与其他简单的资源放在一个XML文件中的元素里。
文件位置:
res/values/filename.xml
文件名任意。<integer-array> 元素的name将被用做资源ID。
资源引用:
Java: R.integer.integer_name
XML: @[package:]array.integer_array_name
语法,如代码清单5-82所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <integer-array name="integer_array_name"> <item >integer</item> </integer-array> </resources>
代码清单5-82
元素:
<resources>
必须。根节点,无属性。
<integer-array>
定义了整数数组。包含一个或多个子<item>元素。
属性:
name
String。Integer的名字。被用于资源ID
<item>
一个integer值。这个值能被另一个integer资源引用。必须是<integer-array>的子节点。无属性
例如,XML文件保存在res/values/integers.xml,如代码清单5-83所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <integer-array name="bits"> <item>4</item> <item>8</item> <item>16</item> <item>32</item> </integer-array> </resources>
代码清单5-83
在应用程序中用代码检索一个整数数组,如代码清单5-84所示:
Resources res = getResources(); int[] bits = res.getIntArray(R.array.bits);
代码清单5-84
5.7.7 Typed Array
TypedArray在XML中定义。您可以使用它来创建一个其他资源的数组,比如drawables。请注意数组不需要类型一致,所以你可以创建一个混合不同资源类型的数组,但你必须知道有什么数据类型,以及数据类型在数组的什么位置, 这样就可以通过TypedArray的get…()方法正确的获得每一个item。
注意:integer array是一种简单的资源,它用name属性提供的值来引用(而不是XML文件的名称)。这样,你可以将integer array资源与其他简单的资源放在一个XML文件中的元素里。
文件位置:
res/values/filename.xml
文件名任意。< array> 元素的name将被用做资源ID。
编译资源数据类型:
TypedArray类型的资源指针
资源引用:
Java: R.array.array_name
XML: @[package:]array.array_name
语法,如代码清单5-85所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <array name="integer_array_name"> <item>resource</item> </array> </resources>
代码清单5-85
元素:
<resources>
必须。根节点,无属性。
<array>
定义了一个数组。包含一个或多个子<item>元素。
属性:
name
String。数组的名字。被用于资源ID
<item>
一个通用类型资源。这个值能被引用到一个资源或者简单数据类型。必须是<array>的子节点。无属性
例如,XML文件保存在res/values/arrays.xml,如代码清单5-86所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <array name="icons"> <item>@drawable/home</item> <item>@drawable/settings</item> <item>@drawable/logout</item> </array> <array name="colors"> <item>#FFFF0000</item> <item>#FF00FF00</item> <item>#FF0000FF</item> </array> </resources>
代码清单5-86
这个应用程序代码检索每个数组,如代码清单5-87所示:
Resources res = getResources(); TypedArray icons = res.obtainTypedArray(R.array.icons); Drawable drawable = icons.getDrawable(0); TypedArray colors = res.obtainTypedArray(R.array.colors); int color = colors.getColor(0,0);
代码清单5-87
本文来自jy02432443,是本人辛辛苦苦一个个字码出来的,转载请保留出处,并保留追究法律责任的权利 QQ78117253