onSharedPreferenceChanged()
侦听器没有要返回的布尔类型,因为onPreferenceChanged()
侦听器具有。
那么如何在验证后拒绝更改?
我遇到的唯一方法是将所有共享首选项保存在局部变量中,如果验证失败,则从局部变量恢复值,如果它通过则更新局部变量。
这是双重工作吗?是否有内置的拒绝机制?
答案 0 :(得分:2)
这是双重工作吗?
我是这么认为的。如果代码的一部分要拒绝此更改,为什么代码的另一部分允许它?
是否有内置的拒绝机制?
用户输入应在onPreferenceChange
提交之前进行验证。看起来onSharedPreferenceChanged
的目的不是验证,而是在提交更改时接收只读实时更新。
由于其他代码可以接收此回调并对其进行操作,因此在此回调期间验证为时已晚。
参考(Preference javadoc):
此类提供要在活动中显示的视图,并与SharedPreferences关联以存储/检索首选项数据
答案 1 :(得分:0)
您可以使用编辑器:(http://developer.android.com/reference/android/content/SharedPreferences.html#edit()),它允许以原子方式进行更改,然后仅在一切正确时调用commit。我希望这会有所帮助。
答案 2 :(得分:0)
刚才遇到这个问题。
以下是解决方案:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if ("mypref".equals(key)) {
String value = sharedPreferences.getString(key, "");
try {
int v = Integer.parseInt(value);
// do whatever is needed
} catch (RuntimeException e) {
String deflt = ... # fetch default value
EditTextPreference p = (EditTextPreference) findPreference(key);
p.setText(def);
}
}
}
信用:http://androidfromscratch.blogspot.ca/2010/11/validating-edittextpreference.html
所以基本上你使用setText
将值恢复为默认值,如果它不符合你的要求。然后,您可以显示Toast或其他任何内容以告知用户该问题。