您的位置:首页 > 产品设计 > UI/UE

EditTextPreference 设置 defaultValue 的数据类型

2016-03-23 16:34 706 查看

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: