提供资源

内容快览

  • 不同类型的资源属于 res/ 的不同子目录
  • 备用资源提供特定于配置的资源文件
  • 始终包含默认资源,使您的应用不依赖于特定的设备配置

本文内容

  1. 分组资源类型
  2. 提供备用资源
    1. 限定符命名规则
    2. 创建别名资源
  3. 利用资源提供最佳设备兼容性
  4. Android 如何找到最匹配资源

另请参阅

  1. 访问资源
  2. 资源类型
  3. 支持多个屏幕

您应该始终外部化应用资源,例如图像和代码中的字符串,这样有利于您单独维护这些资源。 此外,您还应该为特定设备配置提供备用资源,方法是将它们分组到专门命名的资源目录中。 在运行时,Android 会根据当前配置使用适当的资源。例如,您可能需要根据屏幕尺寸提供不同的 UI 布局,或者根据语言设置提供不同的字符串。

外部化应用资源后,即可使用在项目 R 类中生成的资源 ID 访问这些资源。有关如何在应用中使用资源,我们将在访问资源中讨论。 本文档介绍如何对 Android 项目中的资源进行分组,以及如何为特定的设备配置提供备用资源。

分组资源类型


您应将各种资源放入项目 res/ 目录的特定子目录下。例如,以下是一个简单项目的文件层次结构:

MyProject/
    src/   MyActivity.java 
    res/
        drawable/   graphic.png 
        layout/   main.xml info.xml
        mipmap/   icon.png 
        values/   strings.xml 

正如您在此示例中所看到的那样,res/ 目录包含所有资源(在子目录下):一个图像资源、两个布局资源、启动器图标的 mipmap/ 目录以及一个字符串资源文件。资源目录名称非常重要,将在表 1 中进行介绍。

注:如需了解有关使用 mipmap 文件夹的详细信息,请参阅管理项目概览

表 1. 项目 res/ 目录内支持的资源目录

目录资源类型
animator/ 用于定义属性动画的 XML 文件。
anim/ 定义渐变动画的 XML 文件。(属性动画也可以保存在此目录中,但是为了区分这两种类型,属性动画首选 animator/ 目录。)
color/ 用于定义颜色状态列表的 XML 文件。请参阅颜色状态列表资源
drawable/

位图文件(.png.9.png.jpg.gif)或编译为以下 Drawable 资源子类型的 XML 文件:

  • 位图文件
  • 九宫格(可调整大小的位图)
  • 状态列表
  • 形状
  • 动画 Drawable
  • 其他 Drawable

请参阅 Drawable 资源

mipmap/ 适用于不同启动器图标密度的 Drawable 文件。如需了解有关使用 mipmap/ 文件夹管理启动器图标的详细信息,请参阅管理项目概览
layout/ 用于定义用户界面布局的 XML 文件。 请参阅布局资源
menu/ 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。请参阅菜单资源
raw/

要以原始形式保存的任意文件。要使用原始 InputStream 打开这些资源,请使用资源 ID(即R.raw.filename)调用 Resources.openRawResource()

但是,如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录下(而不是 res/raw/)。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager读取这些文件。

values/

包含字符串、整型数和颜色等简单值的 XML 文件。

其他 res/ 子目录中的 XML 资源文件是根据 XML 文件名定义单个资源,而目录中的values/ 文件可描述多个资源。对于此目录中的文件,<resources> 元素的每个子元素均定义一个资源。例如,<string> 元素创建 R.string 资源,<color> 元素创建 R.color资源。

由于每个资源均用其自己的 XML 元素定义,因此您可以根据自己的需要命名文件,并将不同的资源类型放在一个文件中。但是,为了清晰起见,您可能需要将独特的资源类型放在不同的文件中。 例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定:

请参阅字符串资源样式资源更多资源类型

xml/ 可以在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。

注意:切勿将资源文件直接保存在 res/ 目录内,这会导致出现编译错误。

如需了解有关某些资源类型的详细信息,请参阅资源类型文档。

保存在表 1 中定义的子目录下的资源是“默认”资源。即,这些资源定义应用的默认设计和内容。但是,采用 Android 技术的不同设备类型可能需要不同类型的资源。例如,如果设备的屏幕尺寸大于标准屏幕,则应提供不同的布局资源,以充分利用额外的屏幕空间。 或者,如果设备的语言设置不同,则应提供不同的字符串资源,以转换用户界面中的文本。 要为不同的设备配置提供这些不同资源,除了默认资源以外,您还需要提供备用资源。

提供备用资源


图 1. 两种不同的设备,均使用不同的布局资源。

几乎每个应用都应提供备用资源以支持特定的设备配置。 例如,对于不同的屏幕密度和语言,您应分别包括备用 Drawable 资源和备用字符串资源。 在运行时,Android 会检测当前设备配置并为应用加载合适的资源。

为一组资源指定特定于配置的备用资源:

  1. 在 res/ 中创建一个以 <resources_name>-<config_qualifier> 形式命名的新目录。
    • <resources_name> 是相应默认资源的目录名称(如表 1 中所定义)。
    • <qualifier> 是指定要使用这些资源的各个配置的名称(如表 2 中所定义)。

    您可以追加多个 <qualifier>。以短划线将其分隔。

    注意:追加多个限定符时,必须按照表 2 中列出的相同顺序放置它们。如果限定符的顺序错误,则该资源将被忽略。

  2. 将相应的备用资源保存在此新目录下。这些资源文件的名称必须与默认资源文件完全一样。

例如,以下是一些默认资源和备用资源:

res/
    drawable/    icon.png background.png 
    drawable-hdpi/   icon.png background.png 

hdpi 限定符表示该目录中的资源适用于屏幕密度较高的设备。其中每个 Drawable 目录中的图像已针对特定的屏幕密度调整大小,但是文件名完全相同。 这样一来,用于引用 icon.png 或 background.png 图像的资源 ID 始终相同,但是 Android 会通过将设备配置信息与资源目录名称中的限定符进行比较,选择最符合当前设备的各个资源版本。

Android 支持若干配置限定符,您可以通过使用短划线分隔每个限定符,向一个目录名称添加多个限定符。表 2 按优先顺序列出了有效的配置限定符;如果对资源目录使用多个限定符,则必须按照表中列出的顺序将它们添加到目录名称。

表 2. 配置限定符名称。