1. 一个完整的Preference由两部分组成,一个继承自Preference的类(比如系统已定义的CheckBoxPreference或自定义CustomPreference)和放置相应配置信息的XML文件(包括系统已定义标签<PreferenceCategory>,<PreferenceScreen>,<PreferenceGroup>或自定义指向对应CustomPreference类的标签,<CheckBoxPreference>这一类标签等同于自定义标签)。
2.如果仅有Preference,那么可以认为只有了setting的后台内容,即setting的值,结构等等都保存在Preference这一对象这里;setting另外一个重要的部分是UI,从Android3.0之后,UI部分由自定义PreferenceFragment完成。
在自定义PreferenceFragment的onCreate(),onActivityCreated()等回调中,我们可以使用addPreferenceFromResource()(或PreferenceScreen,PreferenceGroup等提供的一些方法,参照API)把XML配置信息视图和UI联系起来。
3.只看2好像只需要把配置信息放置到UI中即可完成setting,那么还需要Preference这个类有什么作用呢?我们查看CheckBoxPreference.java源码进行分析。
package android.preference;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Checkable;
public class CheckBoxPreference extends TwoStatePreference {
public CheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.CheckBoxPreference, defStyle, 0);
setSummaryOn(a.getString(com.android.internal.R.styleable.CheckBoxPreference_summaryOn));
setSummaryOff(a.getString(com.android.internal.R.styleable.CheckBoxPreference_summaryOff));
setDisableDependentsState(a.getBoolean(
com.android.internal.R.styleable.CheckBoxPreference_disableDependentsState, false));
a.recycle();
}
public CheckBoxPreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.checkBoxPreferenceStyle);
}
public CheckBoxPreference(Context context) {
this(context, null);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
View checkboxView = view.findViewById(com.android.internal.R.id.checkbox);
if (checkboxView != null && checkboxView instanceof Checkable) {
((Checkable) checkboxView).setChecked(mChecked);
sendAccessibilityEvent(checkboxView);
}
syncSummaryView(view);
}
}
这里面只有两部分内容——构造函数和onBindView,先看构造函数,setSummaryOn()这个函数对应于属性android:summaryOn,它表示当CheckBoxPreference is Checked时的描述信息
如图中的第二行字。再看onBindView函数,从if中可知它做了check和unCheck这个操作。
总结上述两部分内容,可知Preference所作的是动态操作setting,即用户设置时的操作由它来控制。事实上,它提供了onBindView(),getView()(具体查看API)等与视图相关的操作,还有一些监听操作都在这个类中完成。
总结上述内容,编写一个setting,需要有以下三部分内容:
其中,XML定义了setting结构,CustomPreference完成setting操作,MyPreferenceFragment展现UI视图。
4.对于一些自定义setting,它可能不想系统setting那样是一个列表的形式呈现出来的,系统setting往往如图所示,
那么如果是自定义的如下图所示的setting呢?每一个setting由一个屏(PreferenceScreen)定义,那么这个屏的UI如何与Preference联系起来呢?
这需要我们自定义一个layout,然后在Preference的构造函数中调用setLayoutResource(R.layout.myLayout),然后在getView()中我们可以具体操作这个layout里的控件。