Android支持多种设备的方法及资源文件的使用
Android支持多种设备的方法及资源文件的使用
为不同的设备提供不同的资源,主要是利用特殊命名的资源文件夹来实现的。
在运行时,Android系统根据当前的设备设置自动寻找合适的资源。
默认资源(Default Resources)
编写应用的时候,需要创建一组默认的资源和一些可选针对特定配置的资源。
默认资源是很重要的。
这些情况下会使用默认资源:
当应用处在特定配置下,而程序并没有提供这个配置下的相应资源,会使用默认资源;
新的Android版本增加的资源文件修饰符,旧版本不支持该特性,会使用默认资源;
即便处在特定配置下,而相应资源在该配置下替代资源中没有查找到时,也会使用默认资源。
这里只有一个例外:如果应用程序的minSdkVersion设置为4或者是更高,就可以只提供带有屏幕密度限定符(ldpi、mdpi、hdpi、xhdpi、nodpi、tvdpi)的替代资源,不用设置默认的drawable资源,Andorid系统会自动寻找相应最好的匹配,并且对位图进行缩放。
如果默认资源缺失,编译器并不会报错,但是当运行时找不到时,用户会看到错误信息和一个强制关闭的按钮。
Important: Make sure that your application includes a full set of default resources.
默认资源是一个完备的集合,程序中用到的每一个资源都应该定义了一个默认的资源。
而一个本地化的资源可以是不完备的,只包含一个子集,当某些资源缺失时,会转而读取默认资源中的相应资源。
测试默认资源时可以把装置设置到一个应用并不支持的设置状态下。
比如测试字符串资源,应用程序支持英文和中文(提供了相应的资源),默认是英文。但是把装置语言设置成日文,此时应该显示默认资源(英文),如果默认资源缺失,就会出现强制关闭的按钮。
res/目录下一般包含了所有的资源目录,其中默认资源目录如下:
MyProject/
res/
animator/
anim/
color/
drawable/
layout/
menu/
raw/
values/
xml/
其中values/中常用的文件命名规范:
arrays.xml for resource arrays (typed arrays).
colors.xml for color values
dimens.xml for dimension values.
strings.xml for string values.
styles.xml for styles.
替代资源(Alternative Resources)
Android系统在运行时根据设备格局自动检测并选择资源载入,针对特定的格局提供替代资源时,在res/目录下增加相应的目录(资源目录不能嵌套)。
该文件夹需要遵循一定的命名规则:<resources_name>-<config_qualifier>。
resources_name为相应的默认资源目录名。
config_qualifier为限定符,指定特定的格局或配置,多个限定符可用短划线隔开。多个限定符时要注意一定的连接顺序,否则资源会直接被忽略。
在http://developer.android.com/guide/topics/resources/providing-resources.html
中有一个表Table 2,多个限定符连接时必须要保持它们在表中的先后顺序。
注意:命名是不区分大小写的。
相应的资源存储在新的目录下,资源的名字必须和它们在默认目录下的对应资源一致。
查询设备状态
String locale = context.getResources().getConfiguration().locale.getDisplayName();
别名资源(Alias Resources)
有的时候两种特殊配置下可能想用同一种资源,这时候除了将资源复制两份放在不同的目录下之外,采用别名的机制处理更好。
这种方式不是对所有资源都适用,这种特性只适用于图像、布局、字符串和其他简单值的资源(Drawable、Layout、Strings and other simple values)。
具体方法见:
http://developer.android.com/guide/topics/resources/providing-resources.html
本文不再详述。
发现最匹配资源的策略
附上图一张:
支持不同的语言
http://developer.android.com/training/basics/supporting-devices/languages.html
支持不同的语言主要是利用不同的目录下的字符文件,比如:
res/values/strings.xml 包含默认语言的字符串。
res/values-fr/strings.xml 包含法文的字符串。
res/values-ja/strings.xml 包含日文的字符串。
资源的名字对应好,那么根据不同的本地设置就会自动选择相应的语言。
语言的限定符(Qualifier Values)有两种:
第一种是语言编码:
ISO 639-1:http://www.loc.gov/standards/iso639-2/php/code_list.php
语言编码由两个字母构成。
第二种是区域编码:
ISO 3166-1-alpha-2:
区域编码也由两个小写字母构成,但是前面要加上一个小写的r。
区域编码是一个可选项,也可以只使用语言编码。
例子:
en
fr
en-rUS
fr-rFR
fr-Rca
创建资源文件的时候可以在Eclipse左边导航窗口右键单击,选择new->Others->Android XML File。
选择好对应项目和资源类型(Values)之后,输入文件名strings.xml,然后点击Next,就可以自己选择限定符和填写值了,完成之后目录就自动创建了。
比较常用的目录:
values-zh-rCN简体中文
values-zh-rTW繁体中文
支持不同的屏幕
http://developer.android.com/training/basics/supporting-devices/screens.html
http://developer.android.com/training/multiscreen/index.html
Android利用尺寸(size)和密度(density)对屏幕进行分类。
尺寸有四种:small, normal, large, xlarge。
密度(分辨率)也有四种:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)。
另外屏幕的方向(screens orientation)也是需要考虑的一个方面:landscape为横向,portrait为纵向。
设置不同的布局
根据不同的屏幕尺寸可以安排不同的布局。
采用加上限定符的布局文件目录即可,如:
MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml
使用不同的位图
密度(density)是指单位英寸的像素值,也即屏幕的分辨率。根据分辨率的不同提供不同的界面元素图片。
目录资源可以设置如下:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
用的时候@drawable/awesomeimage引用,系统会根据屏幕密度选择合适的图片版本。
图像资源的生成,采用矢量图,利用如下比例:
xhdpi: 2.0
hdpi: 1.5
mdpi: 1.0 (baseline)
ldpi: 0.75
参考资料
支持不同的设备:
http://developer.android.com/training/basics/supporting-devices/index.html
本地化:
http://developer.android.com/guide/topics/resources/localization.html
提供资源:
http://developer.android.com/guide/topics/resources/providing-resources.html
资源类型:
http://developer.android.com/guide/topics/resources/available-resources.html
语言:
http://developer.android.com/training/basics/supporting-devices/languages.html
不同的屏幕:
http://developer.android.com/training/basics/supporting-devices/screens.html
http://developer.android.com/training/multiscreen/index.html