2

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;
    }
});
4

1 に答える 1