Android更改PreferenceFragment的对话框内容

时间:2018-07-31 09:24:21

标签: android android-fragments android-preferences android-settings

这可能很难理解,请随时进行澄清

  1. 我有一个扩展Task.Exception并加载默认首选项文件的类: PreferenceFragment

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

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

一切运行正常,尝试更改为无效值时用户会收到一个对话框,并且它们没有保存到this.addPreferencesFromResource(R.xml.settings);,但是我有问题:

我的preferences是这样的:

settings.xml

,结果屏幕如下所示: enter image description here

1-当用户点击任何选项时,会弹出一个对话框(由android偏好设置api控制),如果他更改了该值,则会触发<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" /> 并运行我的逻辑

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

问题是:

是否可以更改android PreferenceFragment中内部对话框的内容?

1 个答案:

答案 0 :(得分:2)

您应该为PreferenceFragment类实现Preference.OnPreferenceChangeListener。然后重写onPreferenceChange方法,如果newValue是正确的,则返回true,否则返回false。如果返回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);
    }
}

享受吧。