AlertDialog onChange を表示する SwitchPreference があり、AlertDialog でクリックされたボタン (正/負) に応じて変更を受け入れ/拒否したいと考えています。
ユーザーが値を「true」に変更しようとすると、変更を受け入れる必要があります。それ以外の場合は、AlertDialog を表示し、SwitchPreference の変更を拒否する必要があります。ユーザーが AlertDialog (正のボタン) を確認した場合にのみ、SwitchPreference を変更する必要があります。
以下は、PreferenceActivity を拡張する Activity クラスの関連部分です。SharedPreferences の値は実際には期待どおりに更新されます。SwitchPreference が目に見えて変化しない (スイッチがチェックされたままになっている) だけです。変更を確認するには、SettingsActivity を再度開く必要があります (スイッチがチェックされていません)。
final SwitchPreference passwordEnabled = (SwitchPreference) findPreference(PASSWORD_ENABLED);
passwordEnabled.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(final Preference preference, Object newValue) {
final Context c = getActivity();
if ((boolean) newValue) {
return true;
}
new AlertDialog.Builder(c)
// omitting non-relevant code
.setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((SwitchPreference) preference).setChecked(false);
preference
.getEditor()
.putBoolean(PASSWORD_ENABLED, false)
.commit();
preference.setSummary(R.string.disabled);
}
})
.setNegativeButton(getString(R.string.cancel), null)
.create().show();
return false;
}
});