我试图通过在首选项中为用户提供“全选”和“取消全选”选项来提高应用程序的用户友好性。一切似乎都在工作,除了一个主要缺陷:我正在使用 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);
}
}
}