Android:Preferences类中的共享首选项编辑器

时间:2013-05-20 19:23:56

标签: android sharedpreferences android-preferences

我在我的主要活动中访问了这样的共享偏好:

preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("maxValue", "666");
Boolean test = editor.commit();

当我打开我的Preference活动时,我看到该首选项的值为666.所以这没有问题。

现在我想在我的Preferences.java中做同样的事情,背景是我想检查输入字符串并通知用户是否有错误,例如我想确保如果用户将maxValue设置为1000以上,告诉他这个太高并自动将其设置为899。我已经实现了一个更改侦听器:

@Override
public boolean onPreferenceChange(Preference pref, Object newValue) 
{
  if(Integer.valueOf(etAdd.getEditText().getText().toString()) > 899) 
  {
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("maxValue", "899");
    Boolean test = editor.commit(); //test shows true
    Toast.makeText(Preferences.this, "value too high have set it to the maximum of 899", Toast.LENGTH_LONG).show();   //this toast is shown
  }
  return true;
}

当我重新打开此首选项时,即使在离开首选项活动并返回到该首选项后,我也会看到用户输入的值,例如1000。

有人有想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

根据documentation onPreferenceChange在写入更改之前调用。如果返回true(接受新值),则在离开onPreferenceChange后,将成功应用newValue对象,并忽略您的修改。这就是上述行为的原因。返回false就可以了。

要立即将校正后的值投影到PreferenceActivity,请在EditTextPreference上使用SetText。

使用类型化的newValue.toString()而不是使用相应的EditText的内容也值得考虑。