我想让用户确认应用程序设置中CheckBoxPreference的更改。我试图在OnPreferenceClickListener和OnSharedPreferenceChangeListener中都放入AlertDialog,但在单击首选项后,我没有成功取消CheckBoxPreference更改。谢谢你的帮助。
Nathan,我尝试了以下两个想法:
1) 在首选项活动中实现OnPreferenceClickListener,如下所示:
@Override
public boolean onPreferenceClick(Preference preference) {
new AlertDialog.Builder(this)
.setTitle("Move Data to SD card")
.setMessage("This will ...... Are you sure?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
CheckBoxPreference checkBoxPref = (CheckBoxPreference)findPreference(getString(R.string.prefSDEpisodes_key));
checkBoxPref.setChecked(!checkBoxPref.isChecked() );
}
})
.show();
return false;
}
实际上它是有效的,但我对这个解决方案不满意,因为用户看到CheckBoxPreference的状态在对话框后面的后台发生了变化。这只是一个变通方法,包括交换回盒子。这一点都不干净。我需要在更改之前获得控制权。
2) 使用中的类似代码在PreferenceActivity中实现OnSharedPreferenceChangeListeneronSharedPreferenceChanged(),但在这种情况下,setNegativeButton()中框值的交换以编程方式一次又一次地触发首选项更改事件。摆脱确认对话框的唯一方法是选择"是"。
如果没有简单的解决方案,我准备扩展CheckBoxPrefence,但如何扩展?我应该覆盖哪种方法?
我做到了(顺便说一句,我的代码只在复选框未选中时显示确认对话框,所以我必须更改它)
final CheckBoxPreference myPref = (CheckBoxPreference) findPreference("myPref");
if (myPref != null) {
myPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue instanceof Boolean && ((Boolean) newValue) != PreferencesHelper.getMyPref()) {
final boolean isEnabled = (Boolean) newValue;
if (!isEnabled) {
new AlertDialog.Builder(PreferencesActivity.this)
.setTitle("Confirm")
.setIcon(R.drawable.alert)
.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
// do nothing
}
})
.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
// OK has been pressed => force the new value and update the checkbox display
PreferencesHelper.setMyPref(false);
myPref.setChecked(false);
}
}).create().show();
// by default ignore the pref change, which can only be validated when OK is pressed
return false;
}
}
return true;
}
});
}
=>首选项帮助程序代码
public static boolean getMyPref() {
return getSharedPreferences().getBoolean("myPref", true);
}
public static void setMyPref(boolean newValue) {
Editor edit = getEditor();
edit.putBoolean("myPref", newValue);
edit.apply();
}