应用资源(例如位图和布局)按类型分门别类地整理在每个模块的 res/
目录中。您还可以添加每个文件的替代版本,以针对不同的设备配置进行优化,例如为高密度屏幕添加位图的高分辨率版本。
Android Studio 可通过多种方式帮助您添加新资源和替代资源,具体取决于您要添加的资源类型。本页面介绍了如何添加基本资源文件、如何更改资源的位置以及资源合并的工作原理。
如需详细了解如何创建特定资源类型,请参阅以下页面
- 如需添加布局文件,请参阅使用布局编辑器构建界面。
- 如需添加字符串文件,请参阅使用翻译编辑器本地化界面。
- 如需添加位图,请参阅使用图片素材资源工作室创建应用图标。
- 如需添加 SVG 文件,请参阅添加多密度矢量图形。
如需了解如何从应用代码中引用资源,请参阅应用资源概览。
添加 XML 资源文件
尽管前面的页面链接介绍了针对每种资源类型定制的工作流,您仍然可以按照以下步骤添加任何 XML 资源文件
在 Android 或 Project 视图的 Project 窗口中,点击目标应用模块。
- 依次选择 File > New > Android resource file。
图 1. 新建资源文件对话框。
- 填写对话框中的详细信息
- 文件名称: 输入 XML 文件的名称(不需要
.xml
后缀)。 - 资源类型: 选择您要创建的资源类型。
- 根元素: 如果适用,选择文件的根 XML 元素。某些资源类型仅支持一种根元素类型。根据所选的资源类型,此项可能无法编辑。
- 源集: 选择要保存文件的源集。
- 目录名称: 目录的命名方式必须与资源类型和配置限定符相关。除非您想手动向目录名称添加配置限定符(请改用 Available qualifiers),否则请勿编辑此项。
- 可用限定符: 您可以通过从列表中选择限定符,然后点击 Add
,而不是手动在目录名称中添加配置限定符。
- 文件名称: 输入 XML 文件的名称(不需要
- 添加完所有所需的限定符后,点击 OK。
提示: 如需打开特定于您要添加的资源类型的简化版新建资源文件对话框,请右键点击 res 文件夹中现有的资源目录,然后选择 New > type-name resource file。
内联复杂 XML 资源
某些复杂资源需要多个 XML 资源文件。例如,一个动画矢量可绘制对象包含一个矢量可绘制对象和一个动画对象,并且至少需要三个 XML 文件。
在此示例中,如果您需要重复使用其中一个或多个 XML 文件,可以创建并保留这三个独立的 XML 文件。但如果这些 XML 文件仅用于此动画矢量可绘制对象,则可以改用 Android 资源打包工具 (AAPT) 提供的内联资源格式。借助 AAPT,您可以在一个 XML 文件中定义所有这三个资源。如需了解详情,请参阅内联复杂 XML 资源。
添加资源目录
如需添加新的资源目录,请按照以下步骤操作
在 Project 窗口中点击目标应用模块。
- 依次选择 File > New > Android resource directory。
图 2. 新建资源目录对话框。
- 填写对话框中的详细信息
- 目录名称: 目录的命名方式必须与资源类型和配置限定符的组合相关。除非您想手动向目录名称添加配置限定符(请改用 Available qualifiers),否则请勿编辑此项。
- 资源类型: 选择您希望目录包含的资源类型。
- 源集: 选择您希望目录所在的源集。
- 可用限定符: 您可以通过从列表中选择限定符,然后点击 Add
,而不是手动在目录名称中添加配置限定符。
- 添加完所有所需的限定符后,点击 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
。
但是,如果您的构建配置为给定源集指定了多个资源文件夹,并且这些源之间存在冲突,则会发生错误,并且合并会失败,因为每个资源目录的优先级相同。