環境設定で「すべて選択」および「すべて選択解除」オプションをユーザーに提供することで、アプリの使いやすさを向上させようとしています。1つの大きな欠陥を除いて、物事はうまくいっているようです.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);
}
}
}