Android 更改 PreferenceFragment 的对话框内容
Android changing Dialog content of a PreferenceFragment
这可能很难理解,所以请随时提出任何说明
我有一个 class 扩展 PreferenceFragment
并加载默认首选项文件:
this.addPreferencesFromResource(R.xml.settings);
我有一个 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);
}
}
尽情享受吧。
这可能很难理解,所以请随时提出任何说明
我有一个 class 扩展
PreferenceFragment
并加载默认首选项文件:this.addPreferencesFromResource(R.xml.settings);
我有一个 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);
}
}
尽情享受吧。