10.2 使用资源
Android应用中的资源可以在XML资源文件中使用,也可以使用Java代码访问,而且系统中也自带了很多资源。本节将详细介绍这些资源的的各种访问方法。
10.2.1 生成资源类文件(R.java)
就像Map一样,任何资源都需要通过一个简单的值(key)来获得。而这个key就存在于本节要介绍的R类中。
R类(位于R.java文件中)是一个普通的Java类,R.java是由系统自动生成的(在Android工程的gen目录中),并不需要由开发人员维护。当res目录中的资源发生变化时(可能是添加新的资源,也可能是修改了某些资源的名字),ADT会使用res目录中的资源来同步R类。在解释R类之前,我们先来看一个简单R类。
package mobile.android.first;
public final class R {
// 数组资源
public static final class array {
public static final intincall_refuse_mode_entries=0x7f090001;
public static final intincall_refuse_mode_entry_values=0x7f090002;
}
// 颜色资源
public static final class color {
public static final intdivider=0x7f060000;
public static final inttranslucent_background=0x7f060001;
}
// 图像资源
public static final class drawable {
public static final intabout=0x7f020000;
public static final intface=0x7f020078;
}
// 定义控件、菜单时指定的ID
public static final class id {
public static final intbody_linearlayout=0x7f0b004e;
public static final intbtnCancel=0x7f0b0007;
public static final intbtnChat=0x7f0b0075;
}
// 布局资源
public static final class layout {
public static final intabout=0x7f030000;
public static final intadd_black_list=0x7f030001;
public static final intadd_email=0x7f030002;
}
// 字符串资源
public static final class string {
public static final intapp_name=0x7f070001;
public static final intbusy_sound=0x7f070018;
}
}
从这段代码可以看出,R类中包含了几个内嵌类,而且这几个内嵌类的类名似曾相识。根据这几个类可以得出一个结论:所有的资源对应的索引(Key)都是被封装在R类的内嵌类中的,而且大多数资源(除了values资源)对应的内嵌类都是以资源目录名作为类名的,如drawable、layout。
再看看R类中的每一个内嵌类,在这些类中都定义了若干个被定义为final的int类型变量 。实际上,这里的每一个常量(被声明为final的变量)都对应于一个资源。在编译Android应用时,系统会自动将这些常量与相应的资源一一对应。因此,我们可以直接使用这些常量来引用资源。
也许看到这,读者会产生一些更深入的问题:这些常量以及常量值是怎么来的呢?这些常量值是按着某些规则指定的,还是随便定义的?
首先强调一点,这些常量是由系统自动生成的,这是毋庸至疑的。在理论上,这些常量可以是任何int类型的值,但常量值必须对于当前的应用程序是唯一的。也就是说,当前常量的值不能与其他常量的值和系统资源对应的变量的值重复。不过我们一般并不需要管这些常量是如何取值的,只需要了解如何使用它们即可。
从表面上看,是ADT根据res目录中的资源自动生成R.java文件的,但实际上,ADT是通过aapt(Android Asset Packaging Tool )命令来生成R.java文件的。aapt.exe文件(Mac OS X和Linux的相应命令也叫aapt,但没有文件扩展名)位于/platform-tools目录中。如果想手工生成R.java文件,可以在Windows控制台中输入如下的命令。
aapt package -f -m -J d:\ -S res -I D:\sdk\android-sdk-windows_new\platforms
\android-12\android.jar -M AndroidManifest.xml
对于aapt命令至少应了解如下几点。
生成R.java文件需要在aapt后面加package或p。
-f命令行参数表示如果R.java文件已存在,会使用新的R.java文件覆盖旧的R.java文件。
-m命令行参数表示会在-J命令行参数指定的路径中生成由AndroidManifest.xml文件指定的包目录,而这个AndroidManifest.xml文件由-M命令行参数指定。
在执行上面的命令之前要确保当前目录有包含资源的res目录。读者可以将Android工程目录中的res目录单独复制到其他任何目录下,然后在res所在的目录执行上面的命令即可。
aapt命令需要使用Android SDK中的android.jar文件,因此,要使用-I命令行参数指定android.jar文件的具体位置。android.jar文件在Android SDK中可能存在多个,读者可以选择相应Android版本的android.jar文件。
如果只是生成R.java文件,AndroidManifest.xml文件包含顶层标签以及相应的属性即可,aapt会获取标签的package属性值作为要生成的包目录的目录名。例如,package属性值为mobile.android,那么执行上面的命令行,会在当前目录生成mobile/android目录。也就是说在mobile目录中包含了一个android目录,在android目录中包含了生成的R.java文件。
注意 R类中的常量可以有多种称谓,例如,资源ID、资源索引、key等。为了统一,在本书中将这些常量统称为资源ID。
转自: http://book.51cto.com/art/201311/418570.htm