本篇将了解应用如何访问资源。

一旦您在应用中提供资源,就可以通过引用其资源 ID 来应用它。 所有资源 ID 都是在项目的 R 类中定义的,这是 aapt 工具自动生成的。

在编译应用时,aapt 将生成 R 类,其包含 res/ 目录中所有资源的资源 ID。 对于每种类型的资源,都有一个 R 子类(例如,对所有可绘制资源使用 R.drawable),并且对于该类型的每个资源,都有一个静态整数(例如,R.drawable.icon)。 该整数是可用于取回资源的资源 ID。

尽管 R 类是指定资源 ID 的地方,但您不应该在那里查找资源 ID。 资源 ID 总是由以下部分组成:

  • 资源类型(resource type):每个资源都分组为一个「类型(type)」,如string、drawable 和 layout。 有关不同类型的更多信息,请参阅资源类型
  • 资源名称(resource name),可以是:文件名,不包括扩展名; 或 XML android:name 属性中的值(如果资源是简单值,如字符串)。

有两种方法可以访问资源:

  • 在代码中(In code):使用 R 类的子类中的静态整数,例如:

    R.string.hello

    string 是资源类型,hello 是资源名称。 当您以这种格式提供资源 ID时,有许多 Android API 可以访问您的资源。 请参阅在代码中访问资源

  • 在 XML 中(In XML):使用特殊 XML 语法,其也对应在您的 R 类中定义的资源 ID,例如: @string/hello

    string 是资源类型,hello 是资源名称。 您可以在 XML 资源中的任何地方使用此语法,在该资源中您需要提供值。 请参阅从XML访问资源

Accessing Resources in Code

通过将资源 ID 作为方法参数传递,可以在代码中使用资源。 例如,您可以设置 ImageView 来使用 res/drawable/myimage.png 资源,用 setImageResource()

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

您还可以使用 Resources 中的方法取回单个资源,您可以使用 getResources() 获取实例。

Syntax

以下是在代码中引用资源的语法:

[<package_name>.]R.<resource_type>.<resource_name>

  • <package_name> 是资源所在的软件包的名称(从您自己的软件包中引用资源时不需要)。
  • <resource_type> 是资源类型的 R 子类。
  • <resource_name> 是不带扩展名的资源文件名或 XML 元素中的 android:name 属性值(对于简单值)。

有关每种资源类型以及如何引用它们的更多信息,请参阅资源类型

Use cases

有许多方法可以接受资源 ID 参数,您可以使用资源中的方法检索资源。 您可以使用 Context.getResources() 获取资源实例。

以下是在代码中访问资源的一些示例:

// Load a background for the current screen from a drawable resource
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

注意:你不应该用手修改 R.java 文件 - 它是在编译你的项目时由 aapt 工具生成的。 任何更改将在您下次编译时被覆盖。

Accessing Resources from XML

您可以使用对现有资源的引用来定义某些 XML 属性和元素的值。 创建布局文件时,您经常会这样做,为您的小部件提供字符串和图像。

例如,如果向布局添加按钮,则应该为按钮文本使用字符串资源

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

Syntax

以下是引用 XML 资源中资源的语法:

@[<package_name>:]<resource_type>/<resource_name>

  • <package_name> 是资源所在的软件包的名称(引用同一软件包中的资源时不需要)
  • <resource_type> 是资源类型的 R 子类
  • <resource_name> 是不带扩展名的资源文件名或 XML 元素中的 android:name 属性值(对于简单值)。

有关每种资源类型以及如何引用它们的更多信息,请参阅资源类型

Use cases

在某些情况下,您必须为 XML 中的值使用资源(例如,将可绘制图像应用于窗口小部件),但是您也可以在任何接受简单值的地方使用 XML 中的资源。 例如,如果您有以下资源文件,其中包含一个颜色资源和一个字符串资源

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

您可以在以下布局文件中使用这些资源来设置文本颜色和文本字符串:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />s

在这种情况下,您不需要在资源引用中指定软件包名称,因为资源来自您自己的包。 要引用系统资源,您需要包含软件包名称。 例如:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@android:color/secondary_text_dark"
    android:text="@string/hello" />

注意:您应该始终使用字符串资源,以便可以为其他语言本地化您的应用。 有关创建替代资源(如本地化字符串)的信息,请参阅提供替代资源。 有关本地化其他语言应用的完整指南,请参阅本地化

您甚至可以使用XML中的资源来创建别名。 例如,您可以创建一个可绘制资源,该资源是另一个可绘制资源的别名:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

这听起来多余,但在使用替代资源时可能非常有用。 阅读有关创建别名资源的更多信息。

Referencing style attributes

样式属性资源允许您引用当前应用主题中属性的值。 引用样式属性允许您通过设置样式来自定义UI元素的外观,以匹配当前主题提供的标准变体,而不是提供硬编码的值。 引用一个样式属性本质上是说,「在当前主题中使用由该属性定义的样式」。

要引用样式属性,名称语法几乎与普通资源格式相同,但是使用问号(?)而不是 at 符号(@),而资源类型部分是可选的。 例如:

?[<package_name>:][<resource_type>/]<resource_name>

例如,下面介绍如何引用属性以设置文本颜色以匹配系统主题的「主要」文本颜色:

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

这里,android:textColor 属性指定当前主题中的样式属性的名称。 Android 现在使用应用于 android:textColorSecondary 样式属性的值作为此小部件中 android:textColor 的值。 由于系统资源工具知道在此上下文中需要属性资源,因此不需要明确指定类型(这将是 ?android:attr/textColorSecondary) - 您可以排除 attr 类型。

Accessing Platform Resources

Android 包含许多标准资源,例如样式,主题和布局。 要访问这些资源,请使用 android 软件包名称限定资源引用。 例如,Android 提供了一个可用于 ListAdapter 中的列表项目的布局资源:

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

在本例中,simple_list_item_1 是平台为 ListView 中的项目定义的布局资源。 您可以使用此代替为列表项目创建自己的布局。 有关更多信息,请参阅列表视图开发人员指南。

References

  1. Accessing Resources