创建一个Android工程,Android为我们自动规划了两个目录文件,如下图所示,一个叫res,另一个叫assets,其中assets中保存的一般是原生文件,如MP3文件,字体文件,Android程序不能直接访问,需要通过AssertManage类以二进制形式进行读取。而res目录下资源文件,可能通过Android自动产生的索引文件类R通过名称直接访问。在res目录下通常又分为anim(动画)、drawable(图片,可根据不同的屏幕)、layout(布局文件)、menu(菜单)、raw(原生文件)、values(常量)和xml文件。Android缺省提供了不同的文件用来存放不同的资源文件。实际上我们后面还可能会学到的preference文件和数据文件,包括这些文件,Android缺省都按照最优规则提供了相应的位置。
上图是一个应用工程缺省的资源位置。那么按SDK的建议,对资源文件来说,我们分为两大类型资源,一类是缺省资源,适用于任何配置机器的情况下,另一种是针对特定配置情况下。如布局有针对横屏也必有针对竖屏的。如下图所示:
这一张图来自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会创建一个缺省的目录来管理相应的资源文件,同时也会根据不同的设备配置创建一个对应的资源类型-质量类型的目录用来提供另一种选择的资源。这个目录的文件用来适配特殊的设备配置。
如上图所示,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
650) this.width=650;" height=67 ?489?>
对一个layout的alias
650) this.width=650;" height=133 ?485?>
对一个字符串或者颜色的alias
650) this.width=650;" height=128 ?484?>
从前面这些可以看出所有的引用都是以@开始。当一个目录中含有多个适合当前设备配置的qulifier时,Android1.6以后的选择方式是查找最适合,而之前是精确匹配。