Android 更改 PreferenceFragment 的对话框内容

Android changing Dialog content of a PreferenceFragment

这可能很难理解,所以请随时提出任何说明

  1. 我有一个 class 扩展 PreferenceFragment 并加载默认首选项文件: this.addPreferencesFromResource(R.xml.settings);

  2. 我有一个 Activity 显示此片段并监听应用程序首选项的更改以避免用户设置无效值

@Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    /*do my stuff */  
        }

一切正常 运行,当用户尝试更改为无效值时会出现一个对话框,并且它们不会保存到 preferences,但我遇到了问题:

我的settings.xml是这样的:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <EditTextPreference

        android:defaultValue="5"
        android:inputType="number"
        android:key="@string/pref_comment"
        android:persistent="true"
        android:title="@string/comment" /> 

生成的屏幕如下所示:

1-当用户点击任何选项时,会弹出一个对话框(由 android 首选项 api 控制),如果他更改值,它会触发 onSharedPreferenceChanged 并运行我的逻辑

2-当我拒绝用户传递的值并阻止更改时,我向用户显示一个弹出窗口说更改无效,我不保留该值但首选项 activity 仍然保留内部对话框中的无效值...因此,如果他再次尝试打开相同的选项,将显示无效值。是什么让用户认为价值被保存了...

问题是:

有什么方法可以更改 android PreferenceFragment 中内部对话框的内容吗?

您应该为 PreferenceFragment class 实施 Preference.OnPreferenceChangeListener。然后覆盖 onPreferenceChange 方法,如果 newValue 正确 return true 否则 return false。如果您 return false 则偏好值不会改变。

public class SettingsFragment extends PreferenceFragmentCompat implements
    Preference.OnPreferenceChangeListener {

       @Override
       public boolean onPreferenceChange(Preference preference, Object newValue) {

             int number = 0;
             try{
                   number = Integer.parseInt(newValue.toString());
              }catch(Exception e){

              }

              if (number > 0 && number < 10){    //It's an example
                     return true;                // Preference will change
              }

              return false;          // newValue rejected and preference not change
       }

}

之后您必须将此侦听器设置为相应的首选项。在 onCreatePreference 里面做。

@Override
public void onCreatePreferences(Bundle bundle, String s) {

    addPreferencesFromResource(R.xml.settings);

    PreferenceScreen prefScreen = getPreferenceScreen();
    Preference editTextPrefernce = prefScreen.findPreference(getString(R.string.pref_key));

    if (editTextPrefernce != null && editTextPrefernce instanceof EditTextPreference) {
        editTextPrefernce.setOnPreferenceChangeListener(this);
    }
}

尽情享受吧。