0

我试图通过在首选项中为用户提供“全选”和“取消全选”选项来提高应用程序的用户友好性。一切似乎都在工作,除了一个主要缺陷:我正在使用 SharedPreferences.getAll() 来检索所有复选框,以便我可以迭代它们并选中/取消选中它们。但似乎 getAll() 并没有辜负它的名字。它不会返回所有首选项,而只会返回用户先前更改过的首选项。

那么,有没有办法检索所有的偏好?

我目前正在使用的代码:

public class ADRpreferences extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.preferences);

    ((Preference) findPreference("searchresult_select_all")).
        setOnPreferenceClickListener(new OnPreferenceClickListener() {
             public boolean onPreferenceClick(Preference preference) {
                 setCheckState("searchresult", true);
                 return true;
             }
    });        


    ((Preference) findPreference("searchresult_deselect_all")).
    setOnPreferenceClickListener(new OnPreferenceClickListener() {
         public boolean onPreferenceClick(Preference preference) {
             setCheckState("searchresult", false);
             return true;
         }
    });        
}


private void setCheckState(String prefix, 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( s.startsWith(prefix) && (pref instanceof CheckBoxPreference) ){             
            ((CheckBoxPreference) pref).setChecked(state);
        }
    }

}
}

编辑

好的,现在我将使用 MH 的解决方案。我将复选框首选项的所有 ID 放入 arrays.xml 中,并将使用这些值遍历所有复选框(如果您想知道为什么我不硬编码 ID,那么其中有 44 个)。效果很好,当然将来如果我更改首选项,我将不得不记住在数组中添加/删除 ID。这是新的 setCheckState():

private void setCheckState(String category, Boolean state) {
    String[] arr = null;

    if( category.equals("loadlist") ){
        arr = getResources().getStringArray(R.array.array_loadlist_checkboxes);
    }
    else if( category.equals("searchresult") ){
        arr = getResources().getStringArray(R.array.array_searchresult_checkboxes);
    }
    else{
        return;
    }

    for( String s : arr ){
        Preference pref = findPreference(s);
        if( pref instanceof CheckBoxPreference ){
            ((CheckBoxPreference) pref).setChecked(state);
        }
    }
}
4

0 回答 0