Update time:2019-2-28 Author:要你名三千又三千 type:开发基础学习笔记
学习基础
概览
资源维护的要求:
- 外部化应用资源
您应该始终外部化应用资源,例如图像和代码中的 字符串,这样有利于您单独维护这些资源
- 为特定的设配提供备用资源
方法是将它们分组到专门命名的资源目录中。 在运行时,Android 会根据当前配置使用适当的资源。
目录概览
您应将各种资源放入项目 res/ 目录的特定子目录下
一个简单项目的文件层次结构(Project目录下结构)
MyProject/
src/
MyActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
项目 res/ 目录内支持的资源目录
注释:资源文件不能直接保存在 res/ 目录内,这会导致出现编译错误。
参考地址 https://developer.android.google.cn/guide/topics/resources/providing-resources.html#AlternativeResources
说明:
- 默认资源:
保存在表 中定义的子目录下的资源是“默认”资源。即,这些资源定义应用的默认设计和内容。
- 备用资源
采用 Android 技术的不同设备类型可能需要不同类型的资源。例如,如果设备的屏幕尺寸大于标准屏幕,则应提供不同的布局资源,以充分利用额外的屏幕空间。 或者,如果设备的语言设置不同,则应提供不同的字符串资源,以转换用户界面中的文本。 要为不同的设备配置提供这些不同资源,除了默认资源以外,您还需要提供备用资源
问题:如何为不同的设备提供备用资源?
步骤一:建立备用资源
实现:为一组资源指定特定于配置的备用资源
操作:
在 res/ 中创建一个以 <resources_name>-<config_qualifier> 形式命名的新目录。
解释:
- <resources_name> 是相应默认资源的目录名称(如表 1 中所定义)。
- <配置 限定符> 是指定要使用这些资源的各个配置的名称,可以追加多个 < qualifier >。以短划线将其分隔.
EX:
用于引用 icon.png 或 background.png 图像的资源 ID 始终相同,但是 Android 会通过将设备配置信息与资源目录名称中的限定符进行比较,选择最符合当前设备的各个资源版本.
注释:可以配置多个限定符,但是多个限定符必须有序。按照表中列出的顺序将它们添加到目录名称。
具体内容参考:https://developer.android.google.cn/guide/topics/resources/providing-resources.html#AlternativeResources
简单理解限定符的使用方法
- 不能嵌套使用
- 对于每种限定符类型,仅支持一个值
- 值不区分大小写
- 有顺序
- 单组资源指定多个限定符,并使用短划线分隔。例如,drawable-en-rUS-land 适用于横排美国英语设备。
创建别名资源的方法
问题一:为什么要创建别名资源
情形:如果您想将某一资源用于多种设备配置(但是不想作为默认资源提供),则无需将同一资源放入多个备用资源目录中。(达到资源空间节约的目的)
问题:使用别名资源可以解决以上问题情形。
具体实例:
假设您有一个应用图标 icon.png,并且需要不同语言区域的独特版本。 但是,加拿大英语和加拿大法语这两种语言区域需要使用同一版本。 您可能会认为需要将相同的图像复制到加拿大英语和加拿大法语对应的资源目录中,但事实并非如此。(相同图像在不同位置重复,不易维护)
解决方法:
- 您可以将用于二者的图像另存为 icon_ca.png(除 icon.png 以外的任何名称),并将其放入默认 res/drawable/ 目录中。
- 在 res/drawable-en-rCA/ 和 res/drawable-fr-rCA/ 中创建 icon.xml 文件,使用 < bitmap > 元素引用 icon_ca.png 资源.
https://developer.android.google.cn/guide/topics/resources/providing-resources.html#可绘制对象
问题扩展:创建布局资源的别名
要创建指向现有布局的别名,请使用包装在 中的 元素。例如:
<?xml version="1.0" encoding="utf-8"?>
<merge>
<include layout="@layout/main_ltr"/>
</merge>
此文件的别名:实际应用的布局是main_ltr的。
如果将此文件另存为 main.xml,则会可作为 R.layout.main 引用的资源中,但实际上它是 R.layout.main_ltr 资源的别名()。
同理:可以提供字符串的别名
要创建指向现有字符串的别名,只需将所需字符串的资源 ID 用作新字符串的值即可。例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello</string>
<string name="hi">@string/hello</string>
</resources>
R.string.hi 资源现在是 R.string.hello 的别名
Android 如何查找最佳匹配资源
问题:多个目录包含不同的资源限定符时如何查找,即:查找时所使用的规则是什么?
我称之为:优先 排非 原则
- 找到优先级最高的限定符(限定符有优先顺序)
- 排除不包含此优先限定符的文件夹
- 依次匹配找到最后一个
参考:Android 如何查找最佳匹配资源