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

时间:2022-09-10 16:40:36

第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&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>
    <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