Android框架提供资源文件管理的目的主要有两个:

  1. 逻辑设计与界面设计分开。可以理解成让更好地运用MVC,帮助团队配合。
  2. 资源文件独立为本地化和运行时状态变化提供了一个简便的解决方案。这部分很重要,但是本文不会描述,因为只要知道了资源的使用方式,自然就明白为什么这样就能提供一个解决方案。

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):

http://developer.android.com/intl/zh-CN/guide/topics/resources/providing-resources.html#AlternativeResources

那么,Android到底是怎么寻找最匹配的资源文件的呢?

官网给出了这样一张图和一个简单的例子(链接2)

http://developer.android.com/intl/zh-CN/guide/topics/resources/providing-resources.html#BestMatch

这里我只是解释一下具体的步骤:

  1. 去掉有冲突的资源类型,如系统是中文,那么英文的就不会被匹配;
  2. 按照链接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-GBScreen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch 
Primary text input method = 12key

  1. 去掉冲突的,所以3)被去掉
  2. 根据链接1中表格,下一步匹配的顺序是en, port, ldpi, notouch, 12key。所以:
    1. 匹配en,去掉1、6、7
    2. 匹配port,去掉2、5
    3. 最后只剩下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));

更多相关文章

  1. Android安装常见的一些解决方法
  2. android 关机闹钟
  3. 【Android测试工具】02. Android抓包解析全过程
  4. android 访问/assets 和/res目录下文件的方法
  5. Android写SD卡的坑
  6. 《Android(安卓)安全(二)》Smali语法基础
  7. 浅谈Android的移动存储SharedPreferences技术
  8. Android(安卓)APK签名
  9. 【DiskLruCache完全解析】Android(安卓)AdapterView图片硬盘缓存

随机推荐

  1. 动画 -- View动画 -- 旋转动画
  2. Android系统分区简介
  3. Android Compatibility package 兼容性开
  4. Android高性能编码实战:网络框架优化
  5. android消息机制
  6. Android客户端与Tomcat服务器通信实现登
  7. 【Android】Webview与JavaScript交互介绍
  8. android之字体阴影效果
  9. [直播技术实践]较为完整的开源直播框架[
  10. Android ***测试学习手册(二)准备实验环境