资源文件详解(一)生成资源类文件(R.java)

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类。
 

    
    
    
    
  1. package mobile.android.first;  
  2. public final class R {  
  3.     //  数组资源  
  4.     public static final class array {  
  5.         public static final int incall_refuse_mode_entries=0x7f090001;  
  6.         public static final int incall_refuse_mode_entry_values=0x7f090002;  
  7.     }  
  8.     //  颜色资源  
  9.     public static final class color {  
  10.         public static final int divider=0x7f060000;  
  11.         public static final int translucent_background=0x7f060001;  
  12.     }  
  13.     //  图像资源  
  14.     public static final class drawable {  
  15.         public static final int about=0x7f020000;  
  16.         public static final int face=0x7f020078;  
  17.     }  
  18.     //  定义控件、菜单时指定的ID  
  19.     public static final class id {  
  20.         public static final int body_linearlayout=0x7f0b004e;  
  21.         public static final int btnCancel=0x7f0b0007;  
  22.         public static final int btnChat=0x7f0b0075;  
  23.     }  
  24.     //  布局资源  
  25.     public static final class layout {  
  26.         public static final int about=0x7f030000;  
  27.         public static final int add_black_list=0x7f030001;  
  28.         public static final int add_email=0x7f030002;  
  29.     }  
  30.     //  字符串资源  
  31.     public static final class string {  
  32.         public static final int app_name=0x7f070001;  
  33.         public static final int busy_sound=0x7f070018;  
  34.     }  
  35. }  

从这段代码可以看出,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控制台中输入如下的命令。

    
    
    
    
  1. aapt package -f -m -J d:\ -S res -I D:\sdk\android-sdk-windows_new\platforms  
  2. \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

你可能感兴趣的:(资源文件详解(一)生成资源类文件(R.java))