View绘制体系(三)——AttributeSet与TypedArray详解
前言
上篇博客中讲了LayoutInflater.inflate
机制,其中提到了AttributeSet
和XmlPullParser
两个接口,这里我们来详细的了解一下Android中提供的AttributeSet
接口和它与XmlPullParser
的区别,以及如何使用TypedArray
获取AttributeSet
中对应的属性。
AttributeSet
AttributeSet
是xml文件中元素属性的一个集合。其中提供了各种Api,供我们从已编译好的xml文件获取属性值,如getAttributeIntValue
,getAttributeBooleanValue
,getAttributeFloatValue
等,会返回对应类型的属性值,传入的参数一般有两种形式,如下:
getAttributeXXXValue(int index, XXX defaultValue)
:根据对应属性的索引获取对应的属性值,index取值范围在0~count-1之间,找不到返回defaultValue
getAttributeXXXValue(String namespace, String attribute, XXX defaultValue)
:根据指定命名空间的属性名获取对应的属性值,找不到返回defaultValue
AttributeSet与XmlPullParser
我们现在知道了AttributeSet也是获取xml文件中属性值用的接口,那么它和XmlPullParser有什么关联和区别呢?
我们先看下下面这张类图:
XmlPullParser和AttributeSet都能从Xml文件中获取数据,它们的相同点为:
- 它们有一些重复的方法,如
getAttributeName
,getAttributeValue
等。
区别在于:
- AttributeSet提供了额外的一系列
getAttributeXXXValue
的方法(如getAttributeIntValue),这些方法能返回对应XXX的类型值(如int值),而XmlPullParser获取属性值只能通过getAttributeValue
方法,返回值只能是String类型 - AttributeSet接口从XmlPullParser接口中只保留了必要的方法,去除了next()等方法,并且新增了一些Android独有的方法,可以说AttributeSet是Android独有的用来获取xml文件属性的一个接口
需要注意的是,在Android中,对于AttributeSet接口和XmlPullParser接口,其实现都是结合已有的编译好的xml资源,这些资源是编译时经过aapt生成的高度优化的资源,而不是通过pull方式解析原有的Xml字符串。这与我们常见的一般的XmlPullParser接口的实现机制(kXml,WbXml等)不同。
我们从类图中可以看到实现类有两个,分别是Parser
和XmlPullAttributes
,我们可以看下XmlPullAttributes
的具体实现:
class XmlPullAttributes implements AttributeSet {
XmlPullParser mParser;
public XmlPullAttributes(XmlPullParser parser) {
mParser = parser;
}
public int getAttributeCount() {
return mParser.getAttributeCount();
}
public String getAttributeNamespace (int index) {
return mParser.getAttributeNamespace(index);
}
public String