Android CheckBoxPreference — отменить / проверить все настройки

#android #checkboxpreference

#Android #checkboxpreference

Вопрос:

У меня есть, PreferenceScreen содержащий только CheckBoxPreferences (категории для выбора). Мне нужна опция, чтобы проверить / снять все из них. У меня есть следующий код, который выполняет эту работу, но есть одна проблема: флажки на экране не обновляются — мне нужно было бы вызвать какой-то invalidate в представлении или что-то в этом роде.

Вот мой текущий код:

     private void checkAll() {
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = settings.edit();
        @SuppressWarnings("unchecked")
        Map<String, Boolean> categories = (Map<String, Boolean>) settings.getAll();
        for(String s : categories.keySet()) {
            editor.putBoolean(s, true);
        }
        editor.commit();
    }

    private void uncheckAll() {
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = settings.edit();
        @SuppressWarnings("unchecked")
        Map<String, Boolean> categories = (Map<String, Boolean>) settings.getAll();
        for(String s : categories.keySet()) {
            editor.putBoolean(s, false);
        }
        editor.commit();
        this.restart();
    }
  

Этот код работает нормально, но мне нужно каким-то образом обновить представление, чтобы сразу увидеть результат (а не только после закрытия и повторного запуска операции настройки).

Спасибо всем за любой совет!

Ответ №1:

Это потому, что вы на самом деле не захватываете объекты предпочтений, а только фактические значения. Попробуйте это в своих циклах for:

  boolean theValue = param;
 for(String s : categories.keySet()) {
    Preference pref = findPreference(s);
    if (pref instanceof CheckBoxPreference) {
      CheckBoxPreference check = (CheckBoxPreference)pref;
      check.setChecked(theValue);
    }
  }
  

Я думаю, вы можете опустить вызов редактора и фиксацию, поскольку setChecked () сделает это за вас.

Также проверьте это.

Комментарии:

1. Просто для информации: хотя этот код устарел от HoneyComb, он будет работать до ICS, но не работает с Jelly Bean.

2. Какая часть не работает с Jelly Bean? Я проверил findPreference и setChecked , и они не помечены как устаревшие по состоянию на 4.1.1.

3. Хорошая информация, спасибо. Таким образом можно упростить код и исключить переменную: ((CheckBoxPreference)pref).setChecked(theValue);

Ответ №2:

Теперь у меня есть этот рабочий код, может быть, это кому-нибудь поможет:

 import ...

public class CategoriesActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.category_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.categories_check_all:
                this.checkAll();
                return true;
            case R.id.categories_uncheck_all:
                this.uncheckAll();
                return true;
        }
        return false;
    }

    private void checkAll() {
        this.setCheckState(true);
    }

    private void uncheckAll() {
        this.setCheckState(false);
    }

    private void setCheckState(Boolean state) {
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
        @SuppressWarnings("unchecked")
        Map<String, Boolean> categories = (Map<String, Boolean>) settings.getAll();
        for (String s : categories.keySet()) {
            Preference pref = findPreference(s);
            if (pref instanceof CheckBoxPreference) {
                CheckBoxPreference check = (CheckBoxPreference) pref;
                check.setChecked(state);
            }
        }

    }
}