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 int incall_refuse_mode_entries=0x7f090001;
- public static final int incall_refuse_mode_entry_values=0x7f090002;
- }
- // 颜色资源
- public static final class color {
- public static final int divider=0x7f060000;
- public static final int translucent_background=0x7f060001;
- }
- // 图像资源
- public static final class drawable {
- public static final int about=0x7f020000;
- public static final int face=0x7f020078;
- }
- // 定义控件、菜单时指定的ID
- public static final class id {
- public static final int body_linearlayout=0x7f0b004e;
- public static final int btnCancel=0x7f0b0007;
- public static final int btnChat=0x7f0b0075;
- }
- // 布局资源
- public static final class layout {
- public static final int about=0x7f030000;
- public static final int add_black_list=0x7f030001;
- public static final int add_email=0x7f030002;
- }
- // 字符串资源
- public static final class string {
- public static final int app_name=0x7f070001;
- public static final int busy_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,但没有文件扩展名)位于<Android SDK安装目录>/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文件包含顶层标签<manifest>以及相应的属性即可,aapt会获取<manifest>标签的package属性值作为要生成的包目录的目录名。例如,package属性值为mobile.android,那么执行上面的命令行,会在当前目录生成mobile/android目录。也就是说在mobile目录中包含了一个android目录,在android目录中包含了生成的R.java文件。
注意 R类中的常量可以有多种称谓,例如,资源ID、资源索引、key等。为了统一,在本书中将这些常量统称为资源ID。
转自: http://book.51cto.com/art/201311/418570.htm