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。
相关文章推荐
- UITextField字符缩进、设置placeholder字体大小与颜色
- request方法记录
- AndroidStudio多jar包编译报:java.exe'' finished with non-zero exit value
- (绝对有用)iOS获取UUID,并使用keychain存储
- NGUI UILable 换行
- Task Sequences
- 使用NSMutableURLRequest遇到的坑
- cfg hibernate.hbm2ddl.auto values
- play! guice DI
- 关于uisearchDisplayController
- 深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)
- ios开发基础--滚动视图(UIScrollView)
- UIview和calaver的区别和联系
- Confluence5.1 最新版的安装&破解&汉化
- iOS推送 之 本地通知UILocalNotification
- iOS UIView的drawRect方法 - setNeedsDisplay和setNeedsDisplayInRect.
- Timer搭配TimerTask与Handler使用(更新UI)
- UIViewContentMode各类型效果
- OC学习——OC中的@protocol(@required、@optional)、代理设计模式
- return,continue,break的用法与区别