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