我一直在困惑是否应该花费一定的精力去研究Android资源文件访问,其实内心也是在思考Android是否同其它如Win32应用和Java WEB应用一样。如果一样,我何必多费精力,如果不一样,那么Android是如何定义资源及如何管理资源呢?翻开SDK文档,我们惊讶的发现SDK花了整整一个章节专门论述资源。Android SDK 从最简单的理由说起,比喻说你开发了一个应用,需要面向不同国家语言或者不同屏幕大小,用来表示界面的文字和图片很自然的你需要重新定制,那如何最方便,就是Android 资源文件所要讲述的内容。实际上在Android里,资源这个概念很宽泛,比我们通常认为的如图片、视频或者配置文件啊要宽泛的多。这里我们可以理解为一切非代码的都是资源。比喻,设置桌面背景的图片、设置铃声的音频文件、设置动画效果的XML文件以及定义界面的XML文件等。这些图片、XML文件、音频及视频等统称为资源文件。

4.0.1 Android定义资源的规则

创建一个Android工程,Android为我们自动规划了两个目录文件,如下图所示,一个叫res,另一个叫assets,其中assets中保存的一般是原生文件,如MP3文件,字体文件,Android程序不能直接访问,需要通过AssertManage类以二进制形式进行读取。而res目录下资源文件,可能通过Android自动产生的索引文件类R通过名称直接访问。在res目录下通常又分为anim(动画)、drawable(图片,可根据不同的屏幕)、layout(布局文件)、menu(菜单)、raw(原生文件)、values(常量)和xml文件。Android缺省提供了不同的文件用来存放不同的资源文件。实际上我们后面还可能会学到的preference文件和数据文件,包括这些文件,Android缺省都按照最优规则提供了相应的位置。

image

上图是一个应用工程缺省的资源位置。那么按SDK的建议,对资源文件来说,我们分为两大类型资源,一类是缺省资源,适用于任何配置机器的情况下,另一种是针对特定配置情况下。如布局有针对横屏也必有针对竖屏的。如下图所示:

image

这一张图来自SDK文档,清楚了说明了不同的资源适用于不同的机器配置,有些可能是共用,有些就必须单独设置。Android已经为我们考虑到了,首先Android针对不同的layout可以单独起另一个目录,如res/layout-land就可以存放全部用于横屏的布局。你不用使用特别的控制代码。

4.0.2 资源文件位置规划

前面我们已经说过了Android里面所有一切非代码的都可以称之为资源,而且Android为了性能考虑,已经对资源的位置作了详细的规划,这个一方面是因为所有的资源文件需要经过aapt进行打包压缩,另外一方面,所有在RES的下资源文件实际上都可能通过ID进行代码调用,所有Android对资源放置位置进行了详细的划定,这些划定是不能变动的。比喻说res/目录下就不能直接放资源文件。这里面有一个总原则就是res/资源类型-质量类型/资源文件。不带质量类型的目录是缺省资源文件目录。缺省资源类型目录如下:

目录 资源类型 API Level
res/animator XML 文件,用于定义属性动画 android 3.0 Level 11
res/anim/ XML 文件,用于定义tween animation,前一种也可以放在这个,但一般放上区分开
res/color XML文件,用于定义不同状态的着色值,如按下、移出、移进不同的着色
res/drawable Bitmap文件 或者XML文件,其中bitmap 主要指图片,支持.png,.jpg,.gif,.9.png. XML文件主要是针对一些特定的drawable,如图形、状态等
res/layout/ XML文件,定义用户UI界面LAYOUT
res/menu XML文件,定义用户界面MENU(各种MENU都可行)
res/raw raw form file. 存储在这个目录下的原始文件,有资源ID(文件名字)。同assert下不一样,可用Resources.openRawResource()
res/values XML文件,这个目录下通常是一些常量数据,各种各样,有颜色、字符串、数组类型、尺寸及样式。那么定义在这里的color与前面color目录里有什么不同的呢?这里主要是常量定义,类似于C语言中的define。主要是替换。而前面它是声明的一个状态事件。
res/xml XML文件,但不是用于上述目的的。可使用resources.getXML,主要用于配置

前面所说的对每一个资源目录,Android会创建一个缺省的目录来管理相应的资源文件,同时也会根据不同的设备配置创建一个对应的资源类型-质量类型的目录用来提供另一种选择的资源。这个目录的文件用来适配特殊的设备配置。

image

如上图所示,hpi 在Android中是以qulifier来归类的,drawable是以resources_name来归类的。前面是按照前表唯一的。 后面的qulifier也是有一张表,并且多个qulifer可以通过-连接在一起,如 drawable-zh-dpi等。注意这个是有顺序的。很奇怪的想法,GOOGLE设计这个目录时禁止nested,比喻/res/drawable/drawable-en,并且在这里面资源目录名称大小写是一样的,而且,同一个资源文件如果适用于两个不同的qualifer,必须拷贝两份,也就是目录上同一个qualifer的值不能有两个,如draweable-rES-rFR就不行。但GOOGLE提供了alias资源.但是alias不是万能的。有些情况下如menu,animation,raw等是不行的。但有些是可以的,如对一张图片的alias

image

对一个layout的alias

image

对一个字符串或者颜色的alias

image

从前面这些可以看出所有的引用都是以@开始。当一个目录中含有多个适合当前设备配置的qulifier时,Android1.6以后的选择方式是查找最适合,而之前是精确匹配。

更多相关文章

  1. android的apk文件的xml提取
  2. Android 中,应用程序需要的图片资源如何针对不同屏幕大小手机设计
  3. Android逆向之旅---SO(ELF)文件格式详解
  4. 一款用于在 Android 设备上获取照片(拍照或从相册、文件中选择)、
  5. [置顶] android中图片的三级cache策略(内存、文件、网络)之三:文件

随机推荐

  1. 线程池的封装和使用(二)
  2. Android eMMC Booting
  3. android Gide加载webp图片方法
  4. Android中dip、dp、sp、pt和px的区别
  5. [中英文对照]android Designing for TV(
  6. android 内存缓冲机制:MemoryCache
  7. Android 导航条效果实现(一) TabActivity+T
  8. Android 滑动切换页面-ViewFlipper
  9. Android 5中样式对话框
  10. 2014-11-8Android学习------Android(安卓