Android CheckBoxPreference - 取消/检查所有首选项

时间:2011-05-02 23:12:52

标签: android checkboxpreference

我的PreferenceScreen只包含CheckBoxPreferences(要选择的类别)。我需要一个选项来检查/取消选中所有这些选项。我有以下代码来完成这项工作,但有一个问题:屏幕上的复选框没有更新 - 我需要在视图上调用一些无效的东西。

这是我现在的代码:

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

此代码工作正常,但我需要以某种方式刷新视图以查看结果imediatelly(不仅仅是在关闭并重新启动设置活动之后)。

谢谢大家的任何建议!

2 个答案:

答案 0 :(得分:14)

那是因为你实际上并没有抓住偏好对象,只是实际值。在你的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()将为您执行此操作。

同时检查this

答案 1 :(得分:0)

现在我有了这个工作代码,也许它会帮助某人:

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

    }
}