编译应用时,aapt 会生成 R 类,其中包含 res/ 目录中所有资源的资源 ID。每种类型的资源都有对应的 R 子类(例如,R.drawable 对应所有可绘制资源)。且相应类型的每个资源都有对应的静态整数(例如 R.drawable.icon)。该整型数就是可用来检索资源的资源 ID。
尽管资源 ID 是在 R 类中指定的,但您不需要在该类中查找资源 ID。资源 ID 始终由以下部分组成:
资源类型:每个资源都会被划分到相应的“类型”,例如 string、drawable 和 layout。资源名称是不带扩展名的文件名,或 XML android:name 属性中的值(如资源是字符串等简单值)。在 Android 中,你可以使用两种方式来访问资源:通过资源的 ID(标识符)或通过资源的名称。以下是这两种方式的简单例子:

在 Android 中,每个资源都有一个唯一的整数 ID,可以通过 R 类来引用这些资源。以下是一个通过 ID 访问字符串资源的例子:
// 在 Java 代码中通过资源 ID 访问字符串资源String appName = getResources().getString(R.string.app_name);
在这个例子中,R.string.app_name 引用了一个字符串资源的 ID,getResources().getString() 方法用于获取该字符串资源的实际值。

在代码中引用资源的语法:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name> 是资源所在的软件包的名称(如果所引用的资源来自您自己的软件包,则不需要)。<resource_type> 是资源类型的 R 子类。<resource_name> 是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源为简单值)。2. 通过资源的名称访问资源:
除了通过 ID 访问资源外,你还可以通过资源的名称直接访问资源。这通常用于在 XML 文件中引用资源。以下是一个通过名称访问字符串资源的例子:
<!-- 在 XML 文件中引用字符串资源 --><TextView android:id="@+id/myTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" />
在这个例子中,@string/app_name 引用了一个字符串资源的名称,该名称与 R.string.app_name 中的 ID 相对应。Android 系统会在运行时解析这个名称,并自动查找相应的资源。
在 XML 资源中引用资源的语法:
@[<package_name>:]<resource_type>/<resource_name>
<package_name> 是资源所在软件包的名称(如果所引用的资源来自同一软件包,则不需要)。<resource_type> 是资源类型的 R 子类。<resource_name> 是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源为简单值)。访问原始文件
尽管并不常见,但您可能会需要访问原始文件和目录。如果确有需要,将文件保存在 res/ 中并没有用,因为从 res/ 读取资源的唯一方法是使用资源 ID。您可以改为将资源保存在 assets/ 目录中。
保存在 assets/ 目录中的文件没有资源 ID,因此您无法通过 R 类或在 XML 资源中引用它们。您可以改为采用类似常见文件系统的方式查询 assets/ 目录中的文件,并利用 AssetManager 读取原始数据。
不过,如果您只需要能够读取原始数据(例如视频文件或音频文件),则可将文件保存在 res/raw/ 目录中,并利用 openRawResource() 读取字节流。
访问平台资源Android 包含许多标准资源,例如样式、主题背景和布局。如要访问这些资源,请通过 android 软件包名称限定您的资源引用。
// android.R.layout.simple_list_item_1setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
注意:
提供默认资源至关重要,这不仅是因为应用可能会在超出预期的配置上运行,也因为新版 Android 有时会添加旧版本不支持的配置限定符。如果您使用新的资源限定符,但代码仍然与旧版本 Android 保持兼容,那么当旧版本的 Android 运行您的应用时,如果您不提供默认资源,应用就会崩溃,因为它不能使用以新限定符命名的资源。