2011-05-02 32 views
6

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

这是我本次代码:

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看到的结果(不只是关闭并重新启动设置活动后)。

谢谢大家的任何建议!

回答

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也是如此。

+0

非常感谢你,这是辉煌! – shadyyx 2011-05-03 14:37:45

+0

仅供参考:虽然从HoneyComb弃用此代码将工作到ICS,不能与Jelly Bean一起使用。 – AliR 2013-01-22 05:22:49

+0

哪个部分不能和果冻豆一起使用?我检查了'findPreference'和'setChecked',并且从4.1.1开始它们没有被标记为弃用。 – dmon 2013-01-22 14:48:44

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

    } 
}