详解"/>
Android 资源加载机制详解
Android提供了一种非常灵活的资源系统,可以根据不同的条件提供可替代资源。因此,系统基于很少的改造就能支持新特性,比如Android N中的分屏模式。这也是Android强大部分之一。本文主要讲述Android资源系统的实现原理,以及在应用开发中需要注意的事项。
一、定义资源
Android使用XML文件描述各种资源,包括字符串、颜色、尺寸、主题、布局、甚至是图片(selector,layer-list)。
资源可分为两部分,一部分是属性,另一部分是值。对于android:text="hello,world"
,text
就是属性,hello,world
就是值。
1. 属性的定义
在APK程序中,属性定义在res/values/attrs.xml
中,在系统中属性位于framework/base/core/res/res/values/attrs.xml
文件中。具体定义如下所示:
<declare-styleable name="Window"><attr name="windowBackground" format="reference"/><attr name="windowContentOverlaly" /><attr name="windowFrame" /><attr name="windowTitle" />
</declare-styleable>
styleable相当于一个属性集合,其在R.java文件中对应一个int[]数组,aapt为styleable中的每个attr(属性)分配一个id值,int[]中的每个id对应着styleable中的每一个attr。
对于<declare-styleable name="Window">
,Window相当于属性集合的名称。
对于<attr name="windowBackground">
,windowBackground相当于属性的名称;属性名称在应用程序范围内必须唯一,既无论定义几个资源文件,无论定义几个styleable,windowBackground必须唯一。
在Java代码中,变量在一个作用域内只能声明一次,但可以多次使用。attr
也是一样,只能声明一次,但可以多处引用。如上代码所示,在Window中声明了一个名为windowBackground的attr
,在Window中引用了一个名为windowTitle的attr
。
如果一个attr
后面仅仅有一个name
,那么这就是引用;如果不光有name
还有format
那就是声明。windowBackground是属性的声明,其不能在其他styleable中再次声明;windowTitle则是属性的引用,其声明是在别的styleable中。
2. 值的定义
常见的值一般有以下几种:
- String,Color,boolean,int类型:在
res/values/xxx.xml
文件中指定 - Drawable类型:在
res/drawable/xxx
中指定 - layout(布局):在
res/layout/xxx.xml
中指定 - style(样式):在
res/values/xxx.xml
中指定
值的类型大致分为两类,一类是基本类型,一类是引用类型;对于int,boolean等类型在声明属性时使用如下方式:
<attr name="width" format="integer"/>
<attr name="text" format="string" />
<attr name="centerInParent"="boolean"/>
对于Drawable,layout等类型在声明属性时:
<attr name="background" format="reference"/>
二、解析资源
资源解析主要涉及到两个类,一个是AttributeSet,另一个是TypedArray。
1. AttributeSet
该类位于android.util.AttributeSet,纯粹是一个辅助类,当从XML文件解析时会返回AttributeSet对象,该对象包含了解析元素的所有属性及属性值。并且在解析的属性名称与attrs.xml中定义的属性名称之间建立联系。AttributeSet还提供了一组API接口从而可以方便的根据attrs.xml中已有的名称获取相应的值。
如果使用一般的XML解析工具,则可以通过类似getElementById()等方法获取属性的名称和属性值,然而这样并没有在获取的属性名称与attrs.xml定义的属性名称之间建立联系。
Attribute对象一般作为View的构造函数的参数传递过来,例如:
publlic TextView(Context context,AttributeSet attrs,int
更多推荐
Android 资源加载机制详解
发布评论