这可能很难理解,请随时进行澄清
我有一个扩展Task.Exception
并加载默认首选项文件的类:
PreferenceFragment
我有一个活动,该活动显示此片段并听取应用程序首选项的更改,以避免用户设置无效值
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { /*do my stuff */ }
一切运行正常,尝试更改为无效值时用户会收到一个对话框,并且它们没有保存到this.addPreferencesFromResource(R.xml.settings);
,但是我有问题:
我的preferences
是这样的:
settings.xml
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中内部对话框的内容?
答案 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);
}
}
享受吧。