添加应用资源

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

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

如需详细了解如何创建特定资源类型,请参阅以下页面

如需了解如何从应用代码中引用资源,请参阅应用资源概览

添加 XML 资源文件

尽管前面的页面链接介绍了针对每种资源类型定制的工作流,您仍然可以按照以下步骤添加任何 XML 资源文件

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

  2. 依次选择 File > New > Android resource file

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

  3. 填写对话框中的详细信息
    • 文件名称: 输入 XML 文件的名称(不需要 .xml 后缀)。
    • 资源类型: 选择您要创建的资源类型。
    • 根元素: 如果适用,选择文件的根 XML 元素。某些资源类型仅支持一种根元素类型。根据所选的资源类型,此项可能无法编辑。
    • 源集: 选择要保存文件的源集
    • 目录名称: 目录的命名方式必须与资源类型和配置限定符相关。除非您想手动向目录名称添加配置限定符(请改用 Available qualifiers),否则请勿编辑此项。
    • 可用限定符: 您可以通过从列表中选择限定符,然后点击 Add ,而不是手动在目录名称中添加配置限定符。
  4. 添加完所有所需的限定符后,点击 OK

提示: 如需打开特定于您要添加的资源类型的简化版新建资源文件对话框,请右键点击 res 文件夹中现有的资源目录,然后选择 New > type-name resource file

内联复杂 XML 资源

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

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

添加资源目录

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

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

  2. 依次选择 File > New > Android resource directory

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

  3. 填写对话框中的详细信息
    • 目录名称: 目录的命名方式必须与资源类型和配置限定符的组合相关。除非您想手动向目录名称添加配置限定符(请改用 Available qualifiers),否则请勿编辑此项。
    • 资源类型: 选择您希望目录包含的资源类型。
    • 源集: 选择您希望目录所在的源集。
    • 可用限定符: 您可以通过从列表中选择限定符,然后点击 Add ,而不是手动在目录名称中添加配置限定符。
  4. 添加完所有所需的限定符后,点击 OK

更改您的资源目录

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

但是,您可以使用 sourceSets 代码块中的 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

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