我想要做的是询问用户何时更改EditTextPreference并单击确定,如果某个条件为真,请询问他是否确定要更改设置。
所以如果条件为真,我会显示一个对话框询问他是或否,因为显示对话框是异步的,我在OnPreferenceChange回调中返回false以取消首选项更改。
如果用户决定不更改pref,我什么都不做。但如果单击是,我手动更改首选项和编辑器并提交更改。
现在用户按下是(他想更改pref),如果他再次单击Preferences屏幕中的EditTextPreference,他将在EditText中找到旧值而不是新值。
只有当他关闭“首选项”屏幕并再次打开它时,他才会看到新值。
所以我的问题是,是否有任何方法可以在editor.com发送后在“是”Dialog.OnClickListener()中调用,这将使“首选项”屏幕使用SharedPreferences中的新值更新其视图?
还是有其他办法来实现我想要的东西吗?
感谢
代码示例:
EditTextPreference etp;
etp.setOnPreferenceChangeListener(new OnPreferenceChangeListener()
{
@Override
public boolean onPreferenceChange(final Preference preference, final Object newValue)
{
int a;
int b;
if(a < b) {
AlertDialog.Builder builder = new AlertDialog.Builder(Preferences.this);
Dialog changeMaxCountConfirmationDialog = builder
.setCancelable(true)
.setTitle("Change Setting")
.setMessage("Are you sure you want to change this setting")
.setPositiveButton("Yes", new Dialog.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//Because I return false anyway, I change the preference manually here
Editor editor = preference.getEditor();
editor.putString("key", newValue.toString());
editor.commit();
}
}).setNegativeButton("No", null)
.create();
changeMaxCountConfirmationDialog.show();
return false;
}
return true;
}
});
答案 0 :(得分:1)
我找到了两部分解决方案。第1部分涉及在PreferenceScreen中添加OnSharedPreferenceChangeListener
。
第1部分
public class BaseSettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
...
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(YOUR_KEY)) {
updateUI();
}
}
}
通过此设置,您现在可以在Preference
对象上收听偏好更改,而不是通过SharedPreferences
。
第2部分
您可以在OnPreferenceChangeListener
对象的Preference
内显示对话框(正如OP已经完成的那样)。如果用户确认了他们的选择,您可以使用首选项的setValue
功能设置新值,从而更新SharedPreferences
并调用onSharedPreferenceChanged
。如第1部分所述,onSharedPreferenceChanged
可以包含任何UI更新逻辑(例如更新首选项的摘要)。
public class BaseSettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
//Part 2
final ListPreference listPreference = (ListPreference) findPreference(YOUR_KEY));
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(final Preference preference, final Object newValue) {
new AlertDialog.Builder(c)
.setTitle("Are you sure?")
.setMessage("Are you sure you want to change this preference?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((ListPreference)preference).setValue((String) newValue);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
return false;
}
});
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(YOUR_KEY)) {
updateUI();
}
}
}
答案 1 :(得分:0)
我知道这是一个迟到的答案,但可能对其他人有帮助。
而不是使用Editor
,只需使用EditTextPreference#setText()
。
即。替换你的代码
//Because I return false anyway, I change the preference manually here
Editor editor = preference.getEditor();
editor.putString("key", newValue.toString());
editor.commit();
有这样的事情:
//Because I return false anyway, I change the preference manually here
((EditTextPreference)preference).setText(newValue.toString());