在很多情况下需要为Android提供一些可选的资源以对应Android不同的配置变化,比如响应设备的横竖屏切换需要提供不同的界面布局文件,不同的语言设置需要提供不同的字符串资源。在运行的时候Android系统会自动检测你的设备配置进而加载对应的资源文件。
下面是一个在不同的横竖屏情况下使用不同的配置文件的例子:
设置与配置相对应的可选资源文件的方法:
1. 在res/目录下创建一个新的目录取名为:<resources_name>-<config_qualifier>,其中resources_name是对应的默认资源的文件夹名(我们在上一篇博文中提到的那些),
<qualifier>是说明在某一个特定的配置情况下使用该资源(后面会间接有哪些特定的配置)。你可以添加多个qualifier后缀,以破折号相连接。
2. 将对应的可选资源保存在这个新建的文件夹下,资源文件的名要与对应的默认资源文件的名称一样。
举例:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png其中的hdpi后缀是说明这是一个为高清晰度配置的显示设备提供的。可以看到为不同配置准备的资源其文件名是一样的,这 样的好处是在不同的配置环境下使用同一个资源ID就行了,无需切换, 而android系统会根据你当前的配置,与资源文件夹后面对应的qualifier限定符相比较,找出最合适的资源文件使用。
配置限定符列表:
限定符 | 取值 | 描述 |
---|---|---|
MCC and MNC | Examples:mcc310
mcc310-mnc004
mcc208-mnc00 etc. | MCC是mobile country code移动国家号码的缩写,用于唯一地标识移动客户属于的国家。它由三位十进制数组成(000-999),例如我国的MCC为460,后面有时会跟着SIM卡所属于的mobile network code(MNC)移动网络号码,用于识别移动客户所属的移动网络,MNC由二个十进制数组成,编码范围为十进制的00-99,例如中国移动的MNC为00,中国联通的MNC为01。但是MNC是可选的不一定都要有。例如mcc310是一个美国的任意设备,mcc310-mnc004代表美国运营商Verizon网络中的一台设备,而mcc310-mnc00代表法国运营商Orange网络中的一款设备。 如果设备使用的是无线电连接(GSM手机),MCC就来源于SIM,MNC来源于这台设备所连接的网络。 你也可以只是用MCC(例如,为了在你的应用中包含一些某些国家才允许使用的法定的资源(legalresource))。如果你只想根据语言来进行筛选资源,那么使用language and region限定符(后面会有讲解)。如果你决定使用MCC和MNC限定符,你应该非常仔细,并且检查是否达到了你需要的效果。更多的可以参考Configuration类中的对mcc和mnc成员的描述。 |
Language and region | Examples:en fr en-rUS fr-rFR fr-rCA etc. | 语言是用ISO 639-1标准的两个字母来代表对应的语言的(例如中文的是zh),有时候后面可以跟ISO 3166-1-alpha-2标准里面定义的两个字母的region code地区码(前面跟着一个小写的 r)。 这个编码并不是大小写敏感的,r 前缀是为了区分区域部分。你不能单单使用一个地区码却没有前面的语言码。这个码是可变的,用户可以在你的app的生命周期过程中改变你的系统设置,从而改变语言码和地区码。 Configuration类的locale成员标记了当前配置的设备所处于的位置。 |
Screen size | small normal large xlarge |
Configuration类中的screenLayout成员代表了当前屏幕尺寸是小,一般还是大。 |
Screen aspect | long notlong |
此配置是纯基于屏幕的纵横间距比例的(一个long的屏幕更宽)这与屏幕的横竖向放置是无关的. Configuration类中的screenLayout成员代表了当前屏幕尺寸是否是long类型的。 |
Screen orientation | port land |
这个配置在你app的生命周期中当用户翻转设备的时候这个配置就会变化。 Configuration类中的orientation成员指明了当前设备的横竖方向。 |
Dock mode | car desk |
这个配置在app生命周期中是可变的,如果用户将其放置到了另外一个dock中,你可以enable或者disable这些模式,使用过UiModeManager类。 |
Night mode | night notnight |
这个配置在你app的生命周期中是可以变化的如果你配置night mode被设置为auto,这样的话这个模式会根据一天时间的变化来设置。你可以enable或者disable这一配置使用过UiModeManager类。 |
Screen pixel density (dpi) | ldpi mdpi hdpi xhdpi nodpi |
这三类精度是3:4:6的比例,所以一个9x9的ldpi模式的位图就相当于mdpi模式下的12x12位图和hdpi模式下的and 18x18位图. 当android系统选择某一个合适的资源来使用的时候,对于屏幕精度的处理和其他的qualifier的处理是不同的,在第一步中关于android如何找到最匹配的文件夹,屏幕精度总是被认为是匹配的,在第四步,如果当前正在被检测的qualifier是屏幕精度的时候,android选择在当前点中best final匹配的,而不需要执行step 5. |
Touchscreen type | notouch stylus finger |
Configuration类中的touchscreen成员标记当前触摸屏的类型。 |
Keyboard availability | keysexposed keyssoft |
如果你提供 这个配置在app的生命周期中是可以变化的当用户开启了硬件键盘的时候。 可以参考Configuration类的 |
Primary text input method | nokeys qwerty 12key |
可以参考Configuration类的 |
Navigation key availability | navexposed navhidden |
这个配置在你应用的生命周期中是可以变化的如果用户打开了导航键 Configuration类中的 |
Primary non-touch navigation method | nonav dpad trackball wheel |
Configuration类的 |
System Version (API Level) | Examples:v3 v4 v7 etc. | 设备支持的API level,例如v1代表API Level 1(使用android1.0或者更高版本的设备),v4代表API Level 4 (使用android1.6或者更高版本的设备). |