1. TypedArray
简单来说,TypedArray是通过obtainStyledAttributes方法检索得到的一系列属性的集合,其没有显示的构造方法,通过TypedArray.obtain() 方法从对象池中申请实例,因此使用完毕之后需要用**TypedArray.recycle()**进行回收,以便其他模块对其进行复用。其源码详细分析放在以后再看,现在只需要知道它保存了检索到的一系列属性就可以了。
2. obtainStyledAttributes方法参数小记
阅读源码可知,不同参数的obtainStyledAttributes方法最终调用的都是四参数的obtainStyledAttributes方法,那么我们看一下四参数的obtainStyledAttributes方法,其原型为:
public TypedArray obtainStyledAttributes(AttributeSet set,
@StyleableRes int[] attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
return mThemeImpl.obtainStyledAttributes(this, set, attrs, defStyleAttr, defStyleRes);
}
看一下参数分别代表什么
AttributeSet Set:XML中定义的属性,可以理解为键值对的集合。
@StyleableRes int[] attrs:需要获取的属性名称集合,可以理解为键的集合。
@AttrRes int defStyleAttr:提供一个默认的属性集引用,该参数本身是一个属性值,该属性值是对当前Theme下一个属性集的引用,在XML中找不到相应属性时,就去该参数指向的属性集下寻找相应的属性。
@StyleRes int defStyleRes:提供一个默认的属性集,在前面两者都找不到相应属性时,去该默认属性集下找相应的属性。
当上述属性集中都找不到所需要检索的属性,就会去当前App的Theme中去获取相应属性,因此,在Theme里修改属性,该属性被应用的优先级是最低的。
值得一提的是,还有一种设置属性的方法,即在XML中使用style属性来指定属性集,该种方法设置的属性,其优先级低于在XML中直接设置相关属性,高于用defStyleAttr设置属性。