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:

  http://www.iso.org/iso/prods-services/iso3166ma/02iso-3166-code-lists/country_names_and_code_elements

  区域编码也由两个小写字母构成,但是前面要加上一个小写的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

 

原文地址:https://www.cnblogs.com/mengdd/p/2846640.html