很久没有发博客了,这次试用android的Preference遇到了一些问题,虽然解决方案最后都很轻松,但是过分依赖于找资料的过程可不是很轻松。好了废话不多说,中文搜索出来的首选项都是最最基础的解释和demo,这吧遇到的问题说一说,下面先来说RingstonePreference的问题:
试用RingstonePreference相比于其他的Preference提供的方法感觉略显单薄,尤其setValue、getValue没有提供,就在下一次进入初始化(因为默认试用上一次的,所以试用首选项时记得activity初次加载的时候数据还原)和获取值的时候遇到问题。
今天set的方法在这里搜到了最接近的答案:
其实这个里面的问题只是没有commit
Editor edit=ringPreference.getSharedPreferences().edit();
edit.putString(ringPreference.getKey(), alarm.getRingSource());
edit.commit();
set的方法就是这样的,
下面先附上get的方法,这个比较简单
ringPreference.getSharedPreferences().getString(ringPreference.getKey(), "");
开始纠结于找不到set方法,最后无奈了去看源码,然后所有问题都迎刃而解了,不过在你并不对这些数据能非常简单的控制的时候最好使用上面两种方法,然后其他情况就用到这里了,这里有几个protected方法
protected void onSaveRingtone(Uri ringtoneUri) {
persistString(ringtoneUri != null ? ringtoneUri.toString() : "");
}
再看父类Preference中的两个
protected boolean persistString(String value) {
if (shouldPersist()) {
// Shouldn't store null
if (value == getPersistedString(null)) {
// It's already there, so the same as persisting
return true;
}
SharedPreferences.Editor editor = mPreferenceManager.getEditor();
editor.putString(mKey, value);
tryCommit(editor);
return true;
}
return false;
}
protected String getPersistedString(String defaultReturnValue) {
if (!shouldPersist()) {
return defaultReturnValue;
}
return mPreferenceManager.getSharedPreferences().getString(mKey, defaultReturnValue);
}
这里应该很清晰了,当然,api提供了能获取到值的路径,但也为我们重新构造最适合特定项目中使用的机制,只需要简单的在public方法中super一下就成功了,其他还有很多方法可以构造更有用途的方法,这里就个常用的例子。
因此你可以很方便的构造自己的Preference(在开发过程中其实会用到很多自己重写的Preference,因为有些情况方法没有提供,也有可能会有需要对getValue解析等等很多情况。父类中几乎大多都是protected方法,给重写带来很多方便),Preference为开发提供了很多遍历,这里跟大家分享了
附上父类源码地址:
分享到:
2012-05-21 15:56
浏览 7241
评论