加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

利用attrs.xml和 styles.xml定义Preference

发布时间:2020-12-16 02:19:22 所属栏目:百科 来源:网络整理
导读:1.attrs.xml /android/frameworks/base/core/res/res/values/attrs.xml attrs.xml 文件为 View/ViewGroup 定义了所有可用的属性。 它的根元素是 resources…, 它包含了俩个子元素: a.attr 子元素: 定义的属性。 b.declare-styleable 子元素 :定义一个 sty

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每一个attrID值。

c.第三个参数int对象(com.android.internal.R.attr.preferenceStyle),它是我们在styles.xml文件中定义的 Preference属性默认值,即
这样子,我们就把preference.xml作为Preference属性<attr name=”layout”的默认值。


也就是说,我们将Preference的属性和默认值都放到TypedArray类中,然后通过switch语句将它们提取出来,并利用这些值初始化相关属性,如mLayoutResId

4.CheckBoxPreference.java

最后,我们来看一下继承自PreferenceCheckBoxPreference.java


相比于Preference:
a.attrs.xml文件中添加了几个其他属性值,如 ”summaryOn/summaryOff


b.styles.xml文件中设置了属性 <attr name=”widgetlayout”的默认值。(其实就是在 CheckBoxPreference最右边添加了一个checkBox)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读