Android框架提供资源文件管理的目的主要有两个:
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)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
注意:Android1.5和Android1.6是根据版本号来匹配,而不是上文所述的顺序。如drawable/ (低于1.5的版本), drawable-v4 (1.6版本), and drawable-v6 (2.0.1以上的版本,v5不支持了)。
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));