位图和布局等应用资源会划归到各个模块的 res/
目录内的类型专属目录中。如果有针对不同的设备配置进行了优化的备用版本(例如,适合在高密度屏幕上使用的位图的高分辨率版本),您还可为各个文件添加备用版本。
Android Studio 可以帮助您通过多种方式添加新资源和备用资源,具体取决于您要添加的资源的类型。本页介绍了如何添加基本的资源文件、如何更改资源的位置以及资源合并的工作原理。
如需详细了解如何创建特定资源类型,请参阅以下页面:
- 如需添加布局文件,请参阅使用布局编辑器构建界面。
- 如需添加字符串文件,请参阅使用 Translations Editor 本地化界面。
- 如需添加位图,请参阅使用 Image Asset Studio 创建应用图标。
- 如需添加 SVG 文件,请参阅添加多密度矢量图形。
如需了解如何在应用代码中引用资源,请参阅应用资源概览。
添加 XML 资源文件
尽管上文所列的页面链接会介绍每种资源类型专用的工作流程,但您可通过执行以下步骤添加任何 XML 资源文件:
在 Android 或 Project 视图中,点击 Project 窗口内的目标应用模块。
- 依次选择 File > New > Android resource file。
- 在对话框中填写详细信息:
- File name:输入 XML 文件的名称(不需要输入
.xml
后缀)。 - Resource type:选择要创建的资源的类型。
- Root element:为文件选择根 XML 元素(如果适用)。某些资源类型仅支持 1 种根元素。这项信息可能无法修改,具体取决于所选的资源类型。
- Source set:选择要将文件保存到的源代码集。
- Directory name:目录命名方式必须特定于资源类型和配置限定符。请勿修改此字段,除非您想手动将配置限定符添加到目录名称(需改用 Available qualifiers)。
- Available qualifiers:若要向目录名称添加所需配置限定符,您可从列表中选择它们并点击添加图标 ,而不必手动将它们添加到目录名称。
- File name:输入 XML 文件的名称(不需要输入
- 添加完所需的所有限定符之后,点击 OK。
提示:如需打开与您所需资源类型对应的简化版 New Resource File 对话框,请在 res 文件夹内右键点击现有资源目录,然后依次选择 New > type-name resource file。
内嵌复杂的 XML 资源
提示:某些复杂的资源需要多个 XML 资源文件。例如,动画矢量可绘制对象有一个矢量可绘制对象和一个动画对象,并且需要至少 3 个 XML 文件。
在此示例中,如需重复使用这 3 个不同的 XML 文件中的一个或多个,您可创建并保留这些文件。但是,如果这些 XML 文件仅用于这个动画矢量可绘制对象,您便可改用 Android 资源打包工具 (AAPT) 中提供的内嵌资源格式。借助 AAPT,您可在同一个 XML 文件中定义所有这 3 种资源。如需了解详情,请参阅内嵌复杂的 XML 资源。
添加资源目录
如需添加新的资源目录,请按照以下步骤操作:
点击 Project 窗口中的目标应用模块。
- 依次选择 File > New > Android resource directory。
- 在对话框中填写详细信息:
- Directory name:目录命名方式必须特定于资源类型以及配置限定符的组合。请勿修改此字段,除非您想手动将配置限定符添加到目录名称(需改用 Available qualifiers)。
- Resource type:选择您希望目录包含的资源的类型。
- Source set:选择要将目录保存到哪个源代码集。
- Available qualifiers:若要向目录名称添加所需配置限定符,您可从列表中选择它们并点击添加图标 ,而不必手动将它们添加到目录名称。
- 添加完所需的所有限定符之后,点击 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") } } }
如需了解详情,请参阅源代码集。
资源合并
最终应用文件中的资源可能会有 3 个来源:
- 主源代码集(通常位于
src/main/res/
) - build 变体源代码集
- Android 库 (AAR)
如果各源代码集或库中的所有资源互不相同,它们全都会添加到最终应用内。如果某项资源的文件名在其资源类型目录和资源限定符(若已定义)中都是独一无二的,系统即会将该资源视为具有唯一性。
如果同一资源对应于两个或多个匹配版本,则只有 1 个版本会包含在最终应用内。构建工具会根据以下优先级顺序(左侧的优先级最高)选择要保留的版本:
build 变体 > build 类型 > 产品变种 > 主源代码集 > 库依赖项
例如,如果主源代码集包含:
res/layout/example.xml
res/layout-land/example.xml
并且调试 build 类型包含:
res/layout/example.xml
则最终应用会包含来自调试 build 类型的 res/layout/example.xml
和来自主源代码集的 res/layout-land/example.xml
。
但是,如果您的 build 配置为一个给定的源代码集指定了多个资源文件夹,并且这些来源之间存在冲突,这就会引发错误且会导致合并失败,因为各个资源目录的优先级相同。