Как отобразить измененное значение SwitchPreference после нажатия AlertDialog

У меня есть SwitchPreference, который отображает AlertDialog onChange и хотел бы принять / отклонить изменение в зависимости от нажатия кнопки в AlertDialog (положительный / отрицательный).

Если пользователь пытается изменить значение на "истина", изменение должно быть принято, в противном случае должен быть показан AlertDialog и отклонение SwitchPreference. Только если пользователь подтверждает AlertDialog (положительная кнопка), SwitchPreference следует изменять.

Ниже приведена соответствующая часть моего класса Activity, которая расширяет PreferenceActivity. Значения в 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;
    }
});

1 ответ

Добавьте этот метод в ваш класс, который содержит вышеупомянутый код.

static void updateUI() {
    if(mSharedPreferences.getInt(mSharedPrefKey,0) == 0){
        Log.d(TAG,"Shared preference stored 0");
        mBtHciSnoopLogServer.setChecked(false);
    }
}

А где вы меняете настройку переключателя, вызывайте метод:

  mSharedPreferences.edit().putInt(mSharedPrefKey, 0).commit();
  YourClass.updateUI();

Поскольку метод является статическим, он хранится в глобальном контенте, поэтому все работает нормально.

Другие вопросы по тегам