Android之Providing Resources(提供资源)
当你写程序的时候应该习惯于把一些程序需要用到的资源,例如图片和字符串,分开并独立地保存在你的程序代码之外,这样你就可以独立地维护这些资源文件。你还应该通过特殊的名字的文件路径,为特定的设备配置提供可替换的资源文件。在运行时,Android会基于现在的配置自动应用合适的资源文件。例如,你可以根据不同的屏幕尺寸或基于语言设置的不同的字符串来提供不同的UI布局。
一旦你将资源文件与程序代码分开保存,你可以通过资源ID号来使用对应的资源文件,这些资源ID在项目的R类中自动生成。关于如何在你的程序里面使用资源,可以看看Accessing Resources。这篇文档将介绍如何在你的Android工程下来组织管理你的资源文件,以及如何给特定的设备配置提供可替代的资源。
Grouping Resource Types/资源文件的分类
在你的工程的res/目录下,每个子目录对应一种类型的资源文件。例如,下面是一个简单工程的文件树状结构。
MyProject/
src/
MyActivity.java
res/
drawable/
icon.png
layout/
main.xml
info.xml
values/
strings.xml
这个例子中你可以看到,res/目录下包含了所有的资源文件(在子目录下):一个图片资源,两个布局资源文件,和一个string资源文件。这个资源目录的名字是非常重要的,如Table1:
表1. 工程res/下面可以支持的资源目录:
目录 |
资源类型 |
|
定义动画属性(property animations)的XML文件. |
|
定义补间动画(tween animations)的XML文件. (动画的属性也可以保存在这个目录下,但是 |
|
定义了一些colors对应值的XML文件,见Color State List Resource |
|
Bitmap文件(.png,.9.png,.jpg,.gif)或者能被编译为drawable类型的XML文件: · Bitmap files · Nine-Patches(re-sizable bitmaps)State lists · Color drawables · Shapes · Animation drawables 见 Drawable Resources |
|
定义用户界面布局的XML文件. 见 Layout Resource. |
|
定义程序menus的XML文件,比如Options Menu,Context Menu,或者Sub Menu.见Menu Resource |
|
放置任意的文件,必须为原始形式。使用raw InputStream来打开这些资源文件,调用Resources.openRawResource()方法来打开resource ID对应的资源,比如R.raw.filename。 然而,如果你需要访问原始文件名字和文件目录结构,你可以考虑将一些资源文件保存在 assets/ 目录下(而不是res/raw/)。放在assets/下的文件不提供一个资源ID,所以你只能使用 AssetManager来读取它们。 |
|
包含一些简单值的XML文件,比如strings,integers,和颜色。 在其他res/子目录下定义的XML资源文件定义的是一个单独的基于XML文件名的资源,在values/目录下的文件描述了多种资源。例如这个目录下的某个资源文件,每个<resources>的子节点定义了一个单独资源。比如,<string>节点创建了一个R.string资源,<color>节点创建了一个R.color资源。 因为每个资源都是使用自己的XML文件定义的,你可以任意命名文件,并在一个文件里面放不同种类的资源。但是,为了清晰可见(for clarity),你也许想要在一个文件里面放置统一的资源类型。例如,下面是这个目录下创建资源文件的俗称约定: · arrays.xml:放置资源数组(typed arrays) · colors.xml:放置颜色值(color values) · dimens.xml:放置长度值(dimension values) · strings.xml:放置字符串值(string values) · styles.xml:放置样式(styles) 见 String Resource,Style Resource以及 More Resource Types。 |
|
在运行时可以通过调用Resources.getXML()方法来读取该目录下的任意XML文件。各种XML配置文件都必须保存在这里,比如searchable configuration |
注意:你不可以直接将资源文件保存在res/目录下—这样做会引起编译错误。
要了解更多关于某种特定资源类型的信息,参见:Resource Types文档
你保存在所有子目录中的资源也就是表 1 中定义的你的默认资源。也就是说,这些资源为您的应用程序定义了默认的设置和内容。然而,不同类型的Android驱动设备需要不同类型的资源。例如,当一个设备有比正常屏幕大的屏,那么你应该提供不同的布局资源来充分利用屏幕剩余的空间。或者,如果设备有不同的语言设置,那么应该提供不同的字符串资源来吧文本翻译到你的用户界面上。为了给不同的设备配置提供不同的资源,除了您的默认资源你还需要提供可替代资源。
Providing Alternative Resources/提供可替换的资源
几乎每个程序都应该给特定的设备配置提供可替换的资源。例如,可以为不同的屏幕尺寸提供可替换的资源,不同的语言提供可替换的字符串。运行时,Android会自动检查当前设备配置并为你的应用加载合适的资源。
要指定一组资源配置的具体方案(To specify configuration-specific alternatives for a set of resources):
- 在res/下创建一个新的目录<resources_name>-<config_qualifier>
- <resources_name>是和默认资源相对应的目录名称(如表1定义)。
- <config_qualifier>是指定一个配置相应的名称,同时放在这个目录下的资源会在这个配置上使用。你可以附加多个<config_qualifier>。用破折号进行分开(如表 2定义)。
- 在你新的目录下保存你的可替换资源,这个资源文件必须和默认的资源命名一样
例如,下面是一些默认资源和可替换资源:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
这个hdpi表明在这个目录下的资源将会在高分辨率(hign-density)的设备上使用。同时每个drawable目录下的图片根据特定屏幕密度绘制大小,文件名是相同的。这样,你使用引用icon.png和backgrou.png的资源ID是相同的,但是android会根据通过比较可替代资源的目录名称与设备配置信息来选择最合适的drawable下的资源。
Android支持多种配置标识符(qualifiers),你可以给你一个目录名字增加多个标识符(qualifiers),通过破折号分开。Table 2列出了合法的配置标识符(qualifiers),如果你在一个资源目录下使用了多个标识符,则按顺序来决定优先权,这些配置标识符必须按下表列出来的顺序添加到目录名称:
注意:Android中的一些配置标识符是在1.0版本之后加上的,所以并不是任意版本的Android系统都支持表2列出的配置标识符。新的配置标识符都说明了它们是在哪一版本添加的。为了避免任何可能出现的额问题,您应该始终为您的应用程序所使用的资源设置默认值。要了解更多信息,参见Providing the Best Device Compatibility with Resources部分。
【未完待续】
欢迎转载,转载请注明出处:http://www.cnblogs.com/CodeGuy/