添加应用资源

应用程序资源(如位图和布局)按类型特定的目录组织在每个模块的 res/ 目录中。您还可以添加每个文件的替代版本,这些版本针对不同的设备配置进行了优化,例如,针对高密度屏幕的位图的高分辨率版本。

Android Studio 通过多种方式帮助您添加新资源和替代资源,具体取决于您要添加的资源类型。本页介绍如何添加基本资源文件、如何更改资源的位置以及资源合并的工作方式。

有关如何创建特定资源类型的详细信息,请参阅以下页面

有关如何从应用代码中引用资源的信息,请参阅 应用资源概述

添加 XML 资源文件

虽然前面的页面链接描述了针对每种资源类型定制的工作流程,但您可以按照以下步骤添加任何 XML 资源文件

  1. 项目窗口中,点击Android项目视图中的目标应用模块。

  2. 选择文件 > 新建 > Android 资源文件

    图 1. 新建资源文件对话框。

  3. 填写对话框中的详细信息
    • 文件名:输入 XML 文件的名称(不需要.xml后缀)。
    • 资源类型:选择要创建的资源类型。
    • 根元素:如果适用,选择文件的根 XML 元素。某些资源类型仅支持一种类型的根元素。根据所选资源类型,此选项可能不可编辑。
    • 源集:选择要保存文件的 源集
    • 目录名称:目录必须以特定于资源类型和配置限定符的方式命名。除非要手动向目录名称添加配置限定符(使用可用限定符代替),否则不要编辑此选项。
    • 可用限定符:您可以通过从列表中选择限定符并点击添加 来添加它们,而不是手动在目录名称中包含配置限定符。
  4. 添加完所有所需的限定符后,点击确定

提示: 要打开针对要添加的资源类型定制的简化版新建资源文件对话框,请右键点击res文件夹内的现有资源目录,然后选择新建 > type-name 资源文件

内联复杂 XML 资源

某些复杂资源需要多个 XML 资源文件。例如,动画矢量可绘制对象具有矢量可绘制对象和动画对象,并且至少需要三个 XML 文件。

在此示例中,如果需要重用一个或多个 XML 文件,您可以创建并保留这三个独立的 XML 文件。但是,如果 XML 文件仅用于此动画矢量可绘制对象,则可以使用 Android 资源打包工具 (AAPT) 提供的内联资源格式。使用 AAPT,您可以在一个 XML 文件中定义所有三个资源。有关更多信息,请参阅 内联复杂 XML 资源

添加资源目录

要添加新的资源目录,请按照以下步骤操作

  1. 点击项目窗口中的目标应用模块。

  2. 选择文件 > 新建 > Android 资源目录

    图 2. 新建资源目录对话框。

  3. 填写对话框中的详细信息
    • 目录名称:目录必须以特定于资源类型和配置限定符组合的方式命名。除非要手动向目录名称添加配置限定符(使用可用限定符代替),否则不要编辑此选项。
    • 资源类型: 选择要包含在目录中的资源类型。
    • 源集: 选择要放置目录的源集。
    • 可用限定符: 您可以通过从列表中选择限定符并点击添加 来添加它们,而不是手动在目录名称中包含配置限定符。
  4. 添加完所有所需的限定符后,点击确定

更改资源目录

默认情况下,您的资源位于 module-name/src/source-set-name/res/。例如,模块主源集的资源位于 src/main/res/,调试源集的资源位于 src/debug/res/

但是,您可以使用 build.gradle 文件中的 res.srcDirs 属性将这些路径更改为任何其他位置(相对于 build.gradle 文件)。例如

Groovy

android {
    sourceSets {
        main {
            res.srcDirs = ['resources/main']
        }
        debug {
            res.srcDirs = ['resources/debug']
        }
    }
}

Kotlin

android {
    sourceSets {
        getByName("main") {
            res.srcDirs("resources/main")
        }
        getByName("debug") {
            res.srcDirs("resources/debug")
        }
    }
}

您还可以为一个源集指定多个资源目录,然后构建工具将它们合并在一起。例如

Groovy

android {
    sourceSets {
        main {
            res.srcDirs = ['res1', 'res2']
        }
    }
}

Kotlin

android {
    sourceSets {
        main {
            res.srcDirs("res1", "res2")
        }
    }
}

有关更多信息,请阅读有关 源集 的内容。

资源合并

最终应用文件中的资源可以来自三个来源

  • 主源集(通常位于 src/main/res/ 中)
  • 构建变体 源集
  • Android 库 (AAR)

当来自每个源集或库的所有资源都唯一时,它们将全部添加到最终应用中。如果资源在其 资源类型 目录和 资源限定符(如果已定义)中都具有唯一的文件名,则该资源被视为唯一。

如果存在两个或多个相同资源的匹配版本,则最终应用中只包含一个版本。构建工具将根据以下优先级顺序选择保留哪个版本(左侧优先级最高)

构建变体 > 构建类型 > 产品风格 > 主源集 > 库依赖项

例如,如果主源集包含

  • res/layout/example.xml
  • res/layout-land/example.xml

而调试构建类型包含

  • res/layout/example.xml

那么最终应用将包含来自调试构建类型的 res/layout/example.xml 和来自主源集的 res/layout-land/example.xml

但是,如果您的构建配置为给定源集指定了 多个资源文件夹,并且这些源之间存在冲突,则会发生错误,合并将失败,因为每个资源目录都具有相同的优先级。