应用本地化-让应用适配更多不同手机
设备配置实际是一系列特征组合,用来描述设备当前状态。这些特征包括:屏幕方向、屏幕像素密度、屏幕尺寸键盘类型、底座模式以及语言等。通常,为匹配不同的设备配置,应用会提供不同的备选资源。
如上图,手机旋转前和旋转后使用不同的layout。右击res ->new Android Resource File。
其中available qualifiers选择orientation。
01 资源本地化
应用语言本地化。右击res -> new Android Resource Directory ,Available qualifiers选择locale。
在目录下,新建strings.xml.设置手机的语言为中文,应用会使用values-zh下的资源。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">我的应用 中文</string>
</resources>
1 默认资源
values是默认资源目录。不管手机语言是什么语言,当应用没有对应语言的资源时,都会使用默认资源。
没有配置修饰符的资源就是Android的默认资源。如果无法找到匹配当前配置的资源,Android就会使用默认资源。默认资源至少能保证应用正常运行。
Android默认资源使用规则并不适用于屏幕显示密度。项目的drawable目录通常按屏幕显示密度要求,带有-mdpi、-xxhdpi这样的修饰符。不过,Android决定使用哪一类drawable资源并不是简单地匹配设备的屏幕显示密度,也不是在没有匹配的资源时直接使用默认资源。
最终的选择取决于对屏幕尺寸和显示密度的综合考虑。Android甚至可能会选择低于或高于当前设备屏幕密度的drawable资源,然后通过缩放去适配设备。无论如何,请记住一点:不要在res/drawable/目录下放置默认的drawable资源。
2 检查资源本地化完成情况
右击strings.xml,选择Open Translations Editor菜单项即可。可以看到默认资源和中文资源。
3 区域修饰符
修饰资源目录也可以使用语言加区域修饰符,这样可以让资源使用更有针对性。
例如,西班牙语可以使用-es-rES修饰符,其中,r代表区域,ES是西班牙语的ISO 3166-1-alpha-2标准码。配置修饰符不区分大小写。但最好遵守Android命名约定:语言代码小写,区域代码大写,但前面加个小写的r
-es-rES,看上去像两个不同的修饰符的合体,实际并非如此。这是因为,区域本身不能单独用作修饰符。资源匹配流程:
例子:
02 配置修饰符
可带配置修饰符的设备配置特征,比如语言。
1 | 移动国家码,通常附有移动网络码 |
---|---|
2 | 语言代码,通常附有区域代码 |
3 | 布局方向 |
4 | 最小宽度 |
5 | 可用宽度 |
6 | 可用高度 |
7 | 屏幕尺寸 |
8 | 屏幕纵横比 |
9 | 圆形屏幕(API 23+) |
10 | 广色域 |
11 | 高动态范围 |
12 | 屏幕方向 |
13 | UI模式 |
14 | 夜间模式 |
15 | 屏幕显示密度(dpi) |
16 | 触摸屏类型 |
17 | 键盘可用性 |
18 | 首选输入法 |
19 | 导航键可用性 |
20 | 非文本导航方法 |
21 | API级别 |
出现设备配置与好几个可选资源都匹配的情况。遇到这种状况,Android会基于上表的顺序确定修饰符的使用优先级。
2 多重配置修饰符
可以在同一资源目录上使用多个配置修饰符。这需要各配置修饰符按照优先级别顺序排列。因此,values-zh-w600dp是一个有效的资源目录名,values-w600dp-zh目录名则无效。(在新建资源文件对话框中,工具会自动配置正确的目录名。)
3 寻找最佳资源
首先,当前设备有以下四个版本的字符串备选资源用于crime_title_hint
:
- values/strings.xml
- values-zh/strings.xml
- values-w600dp/strings.xml
- values-zh-w600dp/strings.xml
其次,在设备配置方面,有台Pixel 2,语言设为简体中文,处于横屏状态,屏宽600dp以上(可用宽度731dp,可用高度411dp)。
寻找步骤:
- 排除不兼容的目录
要找到最匹配的资源,Android首先排除不兼容当前设备配置的资源目录。
结合备选资源和设备配置来看,四个版本的备选资源均兼容设备的当前配置。(如果将设备竖起来,设备配置会改变。此时,values-w600dp/与values-zh-w600dp/资源目录不兼容当前配置,因此排除。)
- 按优先级表排除不兼容的目录
筛选掉不兼容的资源目录后,自优先级最高的MCC(移动国家码)开始,Android逐项查看并按优先级表继续筛查不兼容目录(表17-1)。如果有任何以MCC为修饰符的资源目录,那么所有不带MCC修饰符的都会被排除。如果仍有多个目录匹配,Android就继续按次高优先级筛选,如此反复,直至找到唯一满足兼容性的目录。
本例中没有目录包含MCC修饰符,因此无法筛选掉任何目录。接着,Android查看到次高优先级的设备语言修饰符。values-zh和values-zh-w600dp目录包含语言修饰符。因此,不包含语言修饰符的values和values-w600dp可排除。(然而,本章前面说过,没有任何修饰符的values是默认资源,是最后的保障。现在,尽管因缺少语言修饰它被排除掉了,但如果其他values目录在某个低优先级修饰上没有资源可匹配,values依然会挺身而出成为最佳匹配资源。)
由于仍有多个目录匹配,因此继续看优先级表,接下来是屏幕宽度。此时,Android会找到一个带屏宽修饰符的目录以及两个不带屏宽修饰符的目录,因此,values和values-zh目录也被排除。就这样,values-zh-w600dp成了唯一满足兼容需求的目录。
因而,Android最终确定使用values-zh-w600dp目录下的资源。
03 测试备选资源
在布局资源文件可以进行测试。
04 确定设备屏幕尺寸
不同的屏幕尺寸修饰符
修饰符格式 | 描述 |
---|---|
wXXXdp | 可用宽度:大于或等于XXXdp |
hXXXdp | 可用高度:大于或等于XXXdp |
swXXXdp | 最小宽度:宽或高(看哪个更小)大于或等于XXXdp |
假设要指定一个布局仅在屏幕至少300dp宽时使用。据此,你可以使用一个可用的宽度修饰符,把布局文件放在res/layout-w300dp(w代表宽度。同理,h代表高度)这样的目录中。