我试图通过向用户提供"全选"来改善应用的用户友好性。和"取消选择所有"首选项中的选项。除了一个主要缺陷外,事情似乎正在起作用: 我使用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个复选框#39; S)。工作得很好,当然将来我必须记得在我更改首选项时添加/删除数组中的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);
}
}
}