EditTextPreference 设置 defaultValue 的数据类型

EditTextPreference 设置 defaultValue 的数据类型

我们经常使用PreferenceFragment来设置应用的一些配置参数,通常我们需要自定义一个xml文件,用来显示有那些参数,并定义这些参数的默认值。例如下面:

    <EditTextPreference
        android:defaultValue="0000"
        android:dialogTitle="Test"
        android:key="test"
        android:summary="0000"
        android:title="Test"/>

我们想设置一个key为“test”默认值为字符串“0000”的Preference,在PreferenceFragment中通过addPreferencesFromResource()方法将这个xml文件中的Preference添加进来,可是在打开这个EditTextPreference之后发现默认值被设置为“0”,不是我们设想的“0000”。为什么会这样,我们来看下源码:

    public void addPreferencesFromResource(int preferencesResId) {
        requirePreferenceManager();

        setPreferenceScreen(mPreferenceManager.inflateFromResource(getActivity(),
                preferencesResId, getPreferenceScreen()));
    }

中间代码忽略…最后跟踪到下面这个方法:

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getString(index);
    }

然后看一下a.getString(index)的方法体:

    public String getString(int index) {
        if (mRecycled) {
            throw new RuntimeException("Cannot make calls to a recycled instance!");
        }

        index *= AssetManager.STYLE_NUM_ENTRIES;
        final int[] data = mData;
        final int type = data[index+AssetManager.STYLE_TYPE];
        if (type == TypedValue.TYPE_NULL) {
            return null;
        } else if (type == TypedValue.TYPE_STRING) {
            return loadStringValueAt(index).toString();
        }

        TypedValue v = mValue;
        if (getValueAt(index, v)) {
            Log.w(Resources.TAG, "Converting to string: " + v);
            CharSequence cs = v.coerceToString();
            return cs != null ? cs.toString() : null;
        }
        Log.w(Resources.TAG, "getString of bad type: 0x" + Integer.toHexString(type));
        return null;
    }

查看源码发现需要一个TypedValue.TYPE_STRING的数据类型才能正确解析“0000”字符串,那么怎么才能把“0000”定义成TypedValue.TYPE_STRING的数据类型呢,答案其实很简单,我们在字符串资源文件strings.xml文件里定义一个字符串资源:

<resources>
  <string name="test">0000</string>
</resources>

然后将android:defaultValue的值改为字符串引用:

    <EditTextPreference
        android:defaultValue="@string/test"
        android:dialogTitle="Test"
        android:key="test"
        android:summary="0000"
        android:title="Test"/>

这样TypedArray 自然会识别字符串类型,再也不会转换错误了,其它类型都可以这样修改,这样修改的好处是保证默认值数据是你希望的那样。

注意Preference中的android:defaultValue默认只支持这几种数据类型: boolean, float, integer, reference, string。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值