第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所示:

<setandroid:ordering=["together" | "sequentially"]><objectAnimatorandroid: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"]/><animatorandroid: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><objectAnimatorandroid:propertyName="x"android:duration="500"android:valueTo="400"android:valueType="intType"/><objectAnimatorandroid:propertyName="y"android:duration="500"android:valueTo="300"android:valueType="intType"/></set><objectAnimatorandroid: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" ><itemandroid: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所示:

<Buttonandroid: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所示:

<ImageViewandroid: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"?><bitmapxmlns: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所示:

<Buttonandroid: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-patchxmlns: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-listxmlns: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所示:

<ImageViewandroid: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所示:

<Buttonandroid: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-listxmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid: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" ><itemandroid:drawable="@drawable/status_off"android:maxLevel="0" /><itemandroid: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所示:

<ImageButtonandroid: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"?><insetxmlns: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"?><clipxmlns: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所示:

<ImageViewandroid: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"?>
<scalexmlns: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"?><shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape=["rectangle" | "oval" | "line" | "ring"] ><cornersandroid:radius="integer"android:topLeftRadius="integer"android:topRightRadius="integer"android:bottomLeftRadius="integer"android:bottomRightRadius="integer" /><gradientandroid: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"] /><paddingandroid:left="integer"android:top="integer"android:right="integer"android:bottom="integer" /><sizeandroid:width="integer"android:height="integer" /><solidandroid:color="color" /><strokeandroid: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"><gradientandroid: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所示:

<TextViewandroid: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><stringname="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所示:

<TextViewandroid: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-arrayname="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><pluralsname="plural_name"><itemquantity=["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&apos;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 &lt;b>%2$d new messages&lt;/b>.</string>
</resources>

代码清单5-58

在这个格式化字符串里,加入了一个元素。注意左尖括号是用标记&lt转义过的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><stylename="style_name"parent="@[package:]style/style_to_inherit"><itemname="[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"?>
<TextViewstyle="@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><boolname="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><colorname="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所示:

<TextViewandroid: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><dimenname="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所示:

<TextViewandroid: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><itemtype="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><integername="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-arrayname="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><arrayname="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 

转载于:https://www.cnblogs.com/tianjian/p/3487315.html

第三部分:Android 应用程序接口指南---第三节:应用程序资源---第五章 资源类型...相关推荐

  1. 第三部分:Android 应用程序接口指南---第三节:应用程序资源---第四章 本地化...

    第4章 本地化 Android系统会在很多地区的不同设备上运行.为了能够将应用提供给更多的用户,你的应用应该以不同的方式处理文本.音频文件.数字.货币和图形,以适合于你应用使用的地点. 本文档描述了本 ...

  2. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第七章 App Widgets...

    第7章 App Widgets App Widgets是一个应用程序的微型视图,可以嵌入到其他应用程序(如主屏幕)并且能够定期更新.你可以发布一个应用程序的App Widget,而这些视图称为窗口的用 ...

  3. 第三部分:Android 应用程序接口指南---第二节:UI---第八章 Toast通知

    第8章 Toast通知 Toast通知是在窗口前面弹出的信息.它只占有信息所需要的空间量,并且用户当前的activity仍然是可见的.可互动的.这种通知自动地淡入和淡出,它不接受交互事件.他相当于一种 ...

  4. 第三部分:Android 应用程序接口指南---第二节:UI---第六章 对话框

    第6章 对话框 一个对话框是一个小窗口,提示用户做出决定或输入额外的信息,一个对话框不填充屏幕并且通常用于在程序运行时中断,然后弹出通知提示用户,从而直接影响到正在运行的程序.图6-1就是对话框的外观 ...

  5. 【WPF学习】第三十五章 资源字典

    如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <Resour ...

  6. android 学习笔记(三) Android学习路线之3.2 游戏程序员的学习资料

    看到一篇文章,总结一个游戏程序员的学习资料,作者是一个大二的学生,很羡慕作者大二时就有这么清晰的职业目标.我大学学的是自动化专业,大学时也算博览群书,可惜现在大多不知道遗忘在那个角落了.毕业后,单片机 ...

  7. android权威指南十三章,《Android编程权威指南》第30~32以及第34章读书笔记

    配置文件中的broadcast receiver 在配置文件中完成声明后,即使应用当前并未运行,只要有匹配的broadcast intent的发来,broadcast receiver就会接收.收到i ...

  8. Android深度探索(卷1)HAL与驱动开发第五章总结

    开发板是开发和学习嵌入式技术的主要硬件设备,开发板的型号和种类很多,目前流行的是基于S3C6410 ARM11架构的开发板,S3C6410是由三星公司推出的一款低功耗,高性价比的RISC处理器,它基于 ...

  9. 《Android之大话设计模式》--设计模式 创建型模式 第五章:原型模式

    原型模式应用场景举例:  GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让 MM有些不高心,MM说回复信息 ...

最新文章

  1. Cadence入门笔记(1):创建元件库的基本操作!
  2. 永远不要相信用户的输入
  3. Codeforces Round #260 (Div. 1) A - Boredom DP
  4. [云炬创业管理笔记]第6章制定创业行动测试4
  5. 超详细的CMD文件讲解
  6. 猎豹浏览器插件无法加载怎么办 插件无法加载解决方法
  7. Mysql学习总结(58)——深入理解Mysql的四种隔离级别
  8. 【云周刊】第141期:阿里正式发布《Java开发手册》终极版!绝对珍藏!
  9. U盘做启动盘后,如何恢复原始容量
  10. js实现城市拼音首字母排序
  11. SRIO学习笔记之SRIO简介与Xilinx SRIO ip核例程详解
  12. SAP 会计凭证带税码过账
  13. 电脑上怎么打开小米手机的便签?
  14. 云模式下的固定资产管理是什么样的?
  15. node命令与切换node版本
  16. 从表征到行动---意向性的自然主义进路(续八)
  17. 在牛耳培训时的每日一讲ppt
  18. K210(SiPEED MaixBit)MicroPython使用参考(三、播放SD卡内视频文件)
  19. python条形码识别系统_基于Python与Zbar的无人机盘点条形码识别研究
  20. 前端vue开发页面按钮字体颜色白色或文本框不存在谷歌

热门文章

  1. SAP FICO 应收/应付重组配置和操作
  2. tiff格式在arcmap中可以显示,在图片查看软件中全是黑的
  3. 英国政产学研机构联合启动面向复杂路况的自动驾驶计划
  4. MATLAB之时频域乐器信号的分析与处理
  5. 校园导游系统(源码)
  6. Java课程设计:校园导游系统
  7. PyCharm使用pip安装第三方库
  8. 学习笔记:《数字媒体技术概论》-1/10 数字媒体技术基础-中国大学慕课公开课
  9. 【Blender】摄像机-动画
  10. 来自星星的“他”:硅基文明会是怎样形成的?