1.attrs.xml
/android/frameworks/base/core/res/res/values/attrs.xml
attrs.xml
文件为
View/ViewGroup
定义了所有可用的属性。
它的根元素是
<resources…>,
它包含了俩个子元素:
a.attr
子元素:定义的属性。
b.declare-styleable
子元素:定义一个
styleable
对象,每个
styleable
对象都是一组
attr
属性的集合。
在这里我们主要看一下
Preference
组件定义的属性值:
由图中可以看出,定义了一个
Preference
的
styleable
对象,它里面包含了如
layout
、
icon
等属性。
2.styles.xml
/android/frameworks/base/core/res/res/values/styles.xml
styles.xml
文件为在
attrs.xml
文件中定义的属性设定默认值。
在这里我们主要看一下
Preference
组件的默认值:
由代码可以看出,
Preference
的
Style
只定义了
layout
的属性值。那么在
Preference
控件中
,又是如何把这个
layout
加载的。下面看一下
Preference.java
源码。
其中
Preference.CheckBoxPreference
样式是通过圆点“
.
”继承自
Preference
样式,并覆写了其中的属性值“
widgetLayout
”。
3.Preference.java
/android/frameworks/base/core/java/android/preference/Preference.java
Preference.java中有三个构造方法,最后调用的都是第一个构造方法:
Preference(Context context,AttributeSet attrs, int defStyle)
其中最关键的一句代码是:
TypedArray a = context.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.Preference, defStyle,0);
a.第一个参数:AttributeSet对象,它包含了在attrs.xml文件中定义的所有属性。
b.第二个参数:int[]对象(com.android.internal.R.styleable.Preference),它是我们在attrs.xml文件中定义的 Preference属性,即
系统会把Preference styleable编译为一个int[]数组,里面存放的是 Preference每一个attr的ID值。
c.第三个参数:int对象(com.android.internal.R.attr.preferenceStyle),它是我们在styles.xml文件中定义的 Preference属性默认值,即
这样子,我们就把preference.xml作为Preference属性<attr name=”layout”的默认值。
也就是说,我们将Preference的属性和默认值都放到TypedArray类中,然后通过switch语句将它们提取出来,并利用这些值初始化相关属性,如mLayoutResId。
4.CheckBoxPreference.java
最后,我们来看一下继承自Preference的CheckBoxPreference.java。
相比于Preference:
a.在attrs.xml文件中添加了几个其他属性值,如 ”summaryOn/summaryOff等”
b.在styles.xml文件中设置了属性 <attr name=”widgetlayout”的默认值。(其实就是在 CheckBoxPreference最右边添加了一个checkBox)