分析自定义控件ListPreference前,首先来看下ListPreference所用到的一些自定义的属性。关于自定义属性在之前有所提到:Camera学习笔记(一):camera_preferences.xml分析 。
ListPreference所用到的一些自定义的属性定义如下,一般目录在res/values/attrs.xml:
<declare-styleable name="ListPreference">
<attr name="key" format="string" />
<attr name="defaultValue" format="string|reference" />
<attr name="entryValues" format="reference" />
<attr name="entries" format="reference" />
</declare-styleable>
上面的自定义属性包括主键(key)、默认值(defaultValue)、值的集合(entryValue)和值对应的名字(entries)。
自定义控件ListPreference的关键代码构造函数如下:
private final String mKey; //主键
private final CharSequence[] mDefaultValues; //默认值
private CharSequence[] mEntries;
private CharSequence[] mEntryValues;
private CharSequence[] mOriginalSupportedEntries;
private CharSequence[] mOriginalSupportedEntryValues; //记录过滤的分辨率
private CharSequence[] mOriginalEntries;
private CharSequence[] mOriginalEntryValues; //记录应用层所支持的所有分辨率
public ListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.ListPreference, 0, 0);
mKey = a.getString(R.styleable.ListPreference_key);
int attrDefaultValue = R.styleable.ListPreference_defaultValue;
TypedValue tv = a.peekValue(attrDefaultValue);
if (tv != null && tv.type == TypedValue.TYPE_REFERENCE) {
mDefaultValues = a.getTextArray(attrDefaultValue);
} else {
mDefaultValues = new CharSequence[1];
mDefaultValues[0] = a.getString(attrDefaultValue);
}
setEntries(a.getTextArray(R.styleable.ListPreference_entries));
setEntryValues(a.getTextArray(R.styleable.ListPreference_entryValues));
a.recycle();
mOriginalEntryValues = mEntryValues;
mOriginalEntries = mEntries;
}
setEntryValue()是用来读取应用层所支持的分辨率。例如下面的是某个xml文件用到的该控件,代码如下:
<ListPreference
camera:key="pref_camera_picturesize_key"
camera:title="@string/pref_camera_picturesize_title"
camera:entries="@array/pref_camera_picturesize_entries"
camera:entryValues="@array/pref_camera_picturesize_entryvalues" />
则 setEntryValues 里面的参数 R.styleable.ListPreference_entryValues 是为了获取ListPreferences的属性 entryValues,然后再用 a.getTextArray(R.styleable.ListPreference_entryValues)获取所有的分辨率。
private final String mKey; //主键
private final CharSequence[] mDefaultValues; //默认值
private CharSequence[] mEntries;
private CharSequence[] mEntryValues;
private CharSequence[] mOriginalSupportedEntries;
private CharSequence[] mOriginalSupportedEntryValues; //记录过滤的分辨率
private CharSequence[] mOriginalEntries;
private CharSequence[] mOriginalEntryValues; //记录应用层所支持的所有分辨率
public ListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.ListPreference, 0, 0);
mKey = a.getString(R.styleable.ListPreference_key);
int attrDefaultValue = R.styleable.ListPreference_defaultValue;
TypedValue tv = a.peekValue(attrDefaultValue);
if (tv != null && tv.type == TypedValue.TYPE_REFERENCE) {
mDefaultValues = a.getTextArray(attrDefaultValue);
} else {
mDefaultValues = new CharSequence[1];
mDefaultValues[0] = a.getString(attrDefaultValue);
}
setEntries(a.getTextArray(R.styleable.ListPreference_entries));
setEntryValues(a.getTextArray(R.styleable.ListPreference_entryValues));
a.recycle();
mOriginalEntryValues = mEntryValues;
mOriginalEntries = mEntries;
}