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

标签 android sharedpreferences android-preferences

我在我的主要 Activity 中可以访问这样的共享首选项:

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

当我打开我的首选项 Activity 时,我看到该首选项的值为 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;
}

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

有人有想法吗?

谢谢。

最佳答案

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

要立即将更正后的值转换到 PreferenceActivity,请在 EditTextPreference 上使用 SetText。

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

关于Android:首选项类中的共享首选项编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16656834/

相关文章:

Android:如何将 Path 对象放入 Bundle 中?

android - 是否可以从 Native c++ 客户端绑定(bind)到 Java 服务,并进行事务处理,从服务接收数据?

android - Firebase:数据库 '/google_app_measurement_local.db' 未打开

java - 将 LibGDX 与 Android 首选项一起使用

android - 带有自定义布局的 PreferenceFragmentCompat 在 API 28+ 上找不到工具栏

android - 如何更改支持包的首选项对话框颜色?

android - 首选项列表仅显示第一个元素

android - Kotlin 设置全局变量的值

android - 我可以在类似于 Activity.onPause() 的应用程序中使用什么

android - 在 Android 应用程序组件之间共享数据的最佳方式