Android框架提供资源文件管理的目的主要有两个:
- 逻辑设计与界面设计分开。可以理解成让更好地运用MVC,帮助团队配合。
- 资源文件独立为本地化和运行时状态变化提供了一个简便的解决方案。这部分很重要,但是本文不会描述,因为只要知道了资源的使用方式,自然就明白为什么这样就能提供一个解决方案。
1、资源提供的方式
Android程序代码一般的结构是:
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
可以看到,Android所有的资源文件都保存在res目录下,res目录支持的资源类型如下表所示:
目录 |
资源类型 |
animator/ |
定义property 动画的xml文件;property animation指的是 |
anim/ |
定义tween(补间)动画的xml文件。它和property动画的差别可以理解为,tween是两个view切换的动画,而property动画是view里面的对象本身的动画。这个理解不一定正确,但是意思基本是这样。 |
color/ |
定义颜色列表的xml文件 |
drawable/ |
1、位图文件如png、jpg、gif;2、可以编译成drawable资源子类型的xml文件,一般用来组合位图文件。 |
layout/ |
UI文件,这个不用解释。 |
menu/ |
菜单UI文件 |
raw/ |
二进制文件,如视频。如果想直接引用文件名,则使用assert文件夹。 |
values/ |
常用的值如arrays.xml colors.xml string.xml 等等 |
xml/ |
普通xml文件,可以用Resources.getXML()来引用。 |
上表描述的是Android寻找资源文件时的默认文件夹,还可以对上述文件夹进行拓展,以适应不同的运行时系统。这里举两个例子:
1)
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
通过对drawable进行拓展,hdpi文件夹下的文件会自动在相应的屏幕分辨率下被使用。
2)
res/ values/ strings.xml values-zh/ strings.xml
通过对values进行拓展,Android系统可以在运行时根据系统语言自动选择应用程序的语言。
所有的扩展类型可以看官网(链接1):
那么,Android到底是怎么寻找最匹配的资源文件的呢?
官网给出了这样一张图和一个简单的例子(链接2)
http://developer.android.com/intl/zh-CN/guide/topics/resources/providing-resources.html#BestMatch
这里我只是解释一下具体的步骤:
- 去掉有冲突的资源类型,如系统是中文,那么英文的就不会被匹配;
- 按照链接1中表格的顺序进行匹配,去掉那些不成功的文件夹,继续匹配直到只有一个。
比如:
1)drawable/ 2)drawable-en/ 3)drawable-fr-rCA/ 4)drawable-en-port/ 5)drawable-en-notouch-12key/ 6)drawable-port-ldpi/ 7)drawable-port-notouch-12key/
匹配
Locale = en-GB Screen orientation = port Screen pixel density = hdpi Touchscreen type = notouch Primary text input method = 12key
- 去掉冲突的,所以3)被去掉
- 根据链接1中表格,下一步匹配的顺序是en, port, ldpi, notouch, 12key。所以:
- 匹配en,去掉1、6、7
- 匹配port,去掉2、5
- 最后只剩下4。
注意:Android1.5和Android1.6是根据版本号来匹配,而不是上文所述的顺序。如drawable/ (低于1.5的版本), drawable-v4 (1.6版本), and drawable-v6 (2.0.1以上的版本,v5不支持了)。
2、Android资源的使用方式
Android会编译在res目录下的资源,在gen/文件夹下生成R.java文件,文件的大致结构是:
class final class R { public static final class array { public static final int array1= 0x7f090007; } public static final class layout { public static final int list1= 0x7f090007; } }
在代码文件中使用的语法为:
[<package_name>.]R.<resource_type>.<resource_name>
如:
ImageView imageView = (ImageView)findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
在xml文件中使用的方式为:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@color/opaque_red" android:text="@string/hello" />
注意:
1、在xml中使用style attributes的方式有点不一样,它的语法形式是
?[<package_name>:][<resource_type>/]<resource_name>
区别就是前面的”?“,其他xml中引用的方式是”@“。如
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
2、为了使用方便,Android定义了一些常用资源类型,如:
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));