原生Camera设置的分析(三):自定义控件ListPreference分析

 


      分析自定义控件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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值