Android 应用资源(一):资源类型

2,002 阅读7分钟

少壮不努力,老大徒伤悲
- 《长歌行》 汉乐府

导读

Android应用程序主要由两部分内容组成:代码和资源。资源是代码使用的附加文件和静态内容,例如位图,布局,用户界面字符串,动画指令等。 我们应始终将应用程序资源和代码分离来,这给我们带来了以下几个好处:

  • 我们可以独立维护资源和代码,并且资源文件可重复使用;
  • 便于管理,我们以将资源和逻辑分别版本管理和升级;
  • 便于适配,在运行时,Android会根据当前资源文件配置使用适当的资源;
  • 文件占用更小。例如:假设在原来的文本格式的XML文件中,有四个地方使用的都是同一个字符串,那么在最终编译出来的二进制格式的XML文件中,字符串资源池只有一份字符串值,而引用它的四个地方只占用一个整数值。
  • 解析速度更快。由于在二进制格式的XML文件中,所有的XML元素标签和属性等值都是使用整数来描述的,因此,在解析的过程中,就不再需要进行字符串解析,这样就可以提高解析速度。

外部化应用程序资源后,可以使用项目R类中生成的资源ID访问它们。本文主要介绍如何在Android项目中对资源进行分组,为特定设备配置提供备用资源或是访问它们等其他内容将在后续的文章介绍。

应用程序资源的分类

Android应用程序资源可以分为两大类,分别是assets和res:

  • assets:assets类资源放在工程根目录的assets子目录下,它里面保存的是一些原始的文件,可以以任何方式来进行组织。这些文件最终会被原装不动地打包在apk文件中。如果我们要在程序中访问这些文件,那么就需要指定文件名来访问。例如,假设在assets目录下有一个名称为filename的文件,那么就可以使用以下代码来访问它:
   AssetManager am= getAssets();  
   InputStream is = assset.open("filename");
  • res: res类资源放在工程根目录的res子目录下,它里面保存的文件大多数都会被编译,并且都会被赋予资源ID。这样我们就可以在程序中通过ID来访问res类的资源。
    MyProject/
        src/
            MyActivity.java
        res/
            drawable/
                graphic.png
            layout/
                main.xml
                info.xml
            mipmap/
                icon.png
            values/
                strings.xml

我们需要将每种类型的资源放在项目res/目录的特定子目录中,资源目录名称很重要,如下表所示:

目录 资源类型
animator/ 定义属性动画(property animations.)的 XML文件;
anim/ 定义补间动画(tween animations)的XML文件。(属性动画也可以保存在此目录中,但属性动画应首选animator/目录以区分这两种类型);
color/ 定义颜色状态列表的XML文件。可参考 颜色状态列表资源
drawable/ 位图文件(.png,.9.png,.jpg,.gif)或可编译成以下可绘制资源子类型的XML文件:Bitmap files、Nine-Patches (re-sizable bitmaps)、State lists、Shapes、Animation drawables等,更多请查看Drawable Resources
mipmap/ 用于存储启动图标(不同密度)的可绘制文件(drawable)
layout/ 定义用户界面布局的XML文件
menu/ 定义应用程序菜单的XML文件,例如“选项菜单”,“上下文菜单”或“子菜单”;
raw/ 这类资源以任意格式的文件保存在res/raw目录下。你可以通过(InputStream)Resources.openRawResource(R.raw.filename)打开raw文件;
但是,如果需要访问原始文件名和文件层次结构,可以考虑在assets/目录中保存一些资源(而不是res/raw/)。文件中assets/没有给出资源ID,因此您只能通过AssetManager去访问它们。
values/ 包含简单值的XML文件,例如字符串,整数和颜色。
除了values/目录外其他 res/下的目录的XML资源文件都是基于XML文件名定义单个资源,而values/下的xml资源文件则是描述多个资源。
对于values/中的xml文件,该 < resources > 元素下的每个子元素都定义一个资源。例如,< string >元素创建 R.string资源,< color >元素创建R.color 资源。
由于每个资源都使用自己的XML元素定义,因此您可以根据需要为文件命名,并将不同的资源类型放在一个文件中。但是,为清楚起见,您可能希望将不同的资源类型放在不同的文件中。例如,以下是您可以在此目录中创建的资源的一些文件名约定:
array.xml --- 用于资源数组(类型化数组);
colors.xml --- 用于颜色值;
dimens.xml --- 用于维度值;
strings.xml --- 用于字符串值;
styles.xml --- 用于样式。
xml/ 在运行时可以通过Resources.getXML()读取的任意XML文件。各种XML配置文件必须保存在这里;
font/ 字体文件与扩展如 .ttf,.otf,或.ttc,其中包括一个< font-family >元素的XML文件;

永远不要将资源文件直接保存在 res/目录中 - 它会导致编译器错误

上述11种类型(不含assets)的资源文件,除了raw类型资源,以及Bitmap文件的drawable类型资源之外,其它的资源文件均为文本格式的XML文件,它们在打包的过程中,会被编译成二进制格式的XML文件,每一个res资源在编译的打包完成之后,都会被分配一个资源ID,这些资源ID被终会被定义为Java常量值,保存在一个R.java文件中,与应用程序的其它源文件一起被编译到程序中,这样我们就可以在程序或者资源文件中通过这些ID常量来访问指定的资源。

应用资源的概览

下表是每种类型的简短摘要,后续会陆续补充项目资源目录(res/)中提供的特定类型的应用程序资源的用法、格式和语法:

资源类型 简短摘要
动画资源 定义预定动画,含属性、补间、逐帧动画。属性动画保存在res/animator/目录并从R.anim类中访问,补间动画保存在res/anim/目录并从R.anim类中访问,帧动画保存在res/drawable/目录并从R.drawable类中访问,更多请查看Animation Resources
颜色状态列表资源 定义基于View状态更改的颜色资源,保存在res/color/目录并从R.color上访问。更多请查看Color State List Resource
drawable 使用位图或XML定义各种图形,保存在res/drawable/目录并从R.drawable上访问。更多请查看Drawable Resources
布局资源 定义应用程序UI的布局,保存在res/layout目录并从R.layout上访问。更多请查看Layout Resource
菜单资源 定义应用程序菜单的内容,保存在res/menu目录并从R.menu上访问。更多请查看Menu Resource
字符串资源 定义字符串,字符串数组和复数(包括字符串格式和样式),保存在res/values目录并从R.string,R.array以及R.plurals上访问。更多请查看String Resources
style 定义UI元素的外观和格式,保存在res/value目录并从R.style上访问。更多请查看Style Resource
字体资源 定义字体系列并在XML中包含自定义字体,保存在res/font目录并从R.font上访问。更多请查看Font Resources
更多资源类型 将其他原始值定义为静态资源,包括以下内容:
1. Bool : 带有布尔值的XML资源
2. Color : 带有颜色值(十六进制颜色)的XML资源
3.Dimension : 带有维度值(带有度量单位)的XML资源
4. ID : XML资源,为应用程序资源和组件提供唯一标识符
5. Integer : 包含整数值的XML资源
6. Integer Array : 提供整数数组的XML资源
7. Typed Array : 提供TypedArray(可用于drawable数组)的XML资源源
更多请查看More resource types

参考: