跟我学Android应用开发 之 如何添加可选资源(alternative resources)

来源:互联网 发布:淘宝小号批发 编辑:程序博客网 时间:2024/05/06 03:51

    在很多情况下需要为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 MNCExamples:
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 regionExamples:
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 sizesmall
normal
large
xlarge
  • small:屏幕所使用的是低精度的QVGA显示方式。相比于垂直显示的HVGA,这个现实模式 具有相同的宽度但是更小的高度,它的比例是3:4,对应的HVGA的是2:3。例子就是QVGA低精度和VGA高精度。
  • normal: 屏幕是基于传统的中等精度的HVGA显示屏。一个屏幕被认为是normal的,如果一个屏幕至少有这个尺寸(与精度无关),那么 这个屏幕就被认为是normal的。例子就是一个WQVGA低精度显示屏,HVGA中等精度显示屏或者WVGA高精度显示屏。
  • large: 屏幕基于中等精度的VGA屏幕。例如一个比HVGA显示屏的高度和宽度都大的显示屏。样例就是VGA和WVGA中等精度显示屏幕。
  • xlarge:此类屏幕的尺寸要比传统的中等精度的HVGA屏幕大很多。在很多哦情况下,当一个设备的屏幕过大以至于无法放到口袋中的时候,这个设备一般就被认为是一个平板设备。

Configuration类中的screenLayout成员代表了当前屏幕尺寸是小,一般还是大。

Screen aspectlong
notlong
  • long: 长屏幕,例如WQVGA,WVGA,FWVGA
  • notlong: 非长屏幕,例如QVGA, HVGA, 和VGA

此配置是纯基于屏幕的纵横间距比例的(一个long的屏幕更宽)这与屏幕的横竖向放置是无关的.

Configuration类中的screenLayout成员代表了当前屏幕尺寸是否是long类型的。

Screen orientationport
land
  • port: 设备被放置成垂直方向的
  • land: 设备被放置成水平方向的

这个配置在你app的生命周期中当用户翻转设备的时候这个配置就会变化。

Configuration类中的orientation成员指明了当前设备的横竖方向。

Dock modecar
desk
  • car: 设备在一个car dock中(车载模式,如GPS导航仪)
  • desk: 设备处于desk dock中(桌面底座模式,htc貌似出了这些扩展底座设备)

这个配置在app生命周期中是可变的,如果用户将其放置到了另外一个dock中,你可以enable或者disable这些模式,使用过UiModeManager类。

Night modenight
notnight
  • night: 夜晚时间
  • notnight: 白天时间

这个配置在你app的生命周期中是可以变化的如果你配置night mode被设置为auto,这样的话这个模式会根据一天时间的变化来设置。你可以enable或者disable这一配置使用过UiModeManager类。

Screen pixel density (dpi)ldpi
mdpi
hdpi
xhdpi
nodpi
  • ldpi: 低精度屏幕,差不多是120dpi(dots per inch)
  • mdpi: 中等精度的屏幕; 差不多是160dpi.
  • hdpi: 高精度屏幕,差不多是240dpi
  • xhdpi: 超高精度屏幕,大约是320dpi
  • nodpi: 这个可以在bitmap资源上使用当你不想设置你的位图来匹配你设备精度的时候

这三类精度是3:4:6的比例,所以一个9x9的ldpi模式的位图就相当于mdpi模式下的12x12位图和hdpi模式下的and 18x18位图.

当android系统选择某一个合适的资源来使用的时候,对于屏幕精度的处理和其他的qualifier的处理是不同的,在第一步中关于android如何找到最匹配的文件夹,屏幕精度总是被认为是匹配的,在第四步,如果当前正在被检测的qualifier是屏幕精度的时候,android选择在当前点中best final匹配的,而不需要执行step 5. 

Touchscreen typenotouch
stylus
finger
  • notouch: 设备不支持触摸屏
  • stylus: 设备有触摸屏但是需要使用触针(或者触笔)才能使用
  • finger: 设备拥有一个触摸屏,是手触的

Configuration类中的touchscreen成员标记当前触摸屏的类型。

Keyboard availabilitykeysexposed
keyssoft
  • keysexposed: 设备有键盘,如果设备有一个软件模拟的键盘,这个配置也会被使用,即使是硬件键盘并没有被使用或者根本就没有如果没有软件键盘提供给用户或者被disable掉了,那这个配置只有当硬件键盘提供给用户的时候才会被使用。
  • keyshidden: 设备有一个硬件键盘但是被隐藏掉了,而且设备并没有将软件键盘enble
  • keyssoft: 设备使能了软件键盘,无论它是否是可见的。

如果你提供 keysexposed资源,但是并没有keyssoft资源,系统使用keysexposed资源,无论一个键盘是否是可见的,只要系统将一个软件键盘enable了.

这个配置在app的生命周期中是可以变化的当用户开启了硬件键盘的时候。

可以参考Configuration类的hardKeyboardHidden成员和keyboardHidden成员, 分别代表硬件软件或者任意种类键盘的可见性。

Primary text input methodnokeys
qwerty
12key
  • nokeys: 设备没有硬件按钮用于输入文本.
  • qwerty: 设备拥有硬件的qwerty键盘, 无论它是否是对用户可见的.
  • 12key: 设备拥有12个键的硬件键盘,无论它是否是对用户可见的.

可以参考Configuration类的keyboard成员,表明了主要的文本输入方式。

Navigation key availabilitynavexposed
navhidden
  • navexposed: 用户可以使用导航键.
  • navhidden: 导航键不可用.

这个配置在你应用的生命周期中是可以变化的如果用户打开了导航键

Configuration类中的 navigationHidden成员代表当前导航键是否被隐藏了.

Primary non-touch navigation methodnonav
dpad
trackball
wheel
  • nonav: 设备除了触摸屏之外没有其它导航设备.
  • dpad: 设备拥有一个手柄装置来导航.
  • trackball: 设备拥有一个trackball开导航.
  • wheel: 设备拥有一个directional wheel(s) 来进行导航(不是很常用).

Configuration类的navigation成员表明了当前可用的导航方式.

System Version (API Level)Examples:
v3
v4
v7
etc.

设备支持的API level,例如v1代表API Level 1(使用android1.0或者更高版本的设备),v4代表API Level 4 (使用android1.6或者更高版本的设备).


原创粉丝点击