如何拒绝onSharedPreferenceChanged()侦听器中的更改

时间:2014-10-13 07:42:28

标签: android validation sharedpreferences

onSharedPreferenceChanged()侦听器没有要返回的布尔类型,因为onPreferenceChanged()侦听器具有。

那么如何在验证后拒绝更改?

我遇到的唯一方法是将所有共享首选项保存在局部变量中,如果验证失败,则从局部变量恢复值,如果它通过则更新局部变量。

这是双重工作吗?是否有内置的拒绝机制?

3 个答案:

答案 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或其他任何内容以告知用户该问题。