#android #checkboxpreference
#Android #checkboxpreference
Вопрос:
У меня есть, PreferenceScreen
содержащий только CheckBoxPreferences
(категории для выбора). Мне нужна опция, чтобы проверить / снять все из них. У меня есть следующий код, который выполняет эту работу, но есть одна проблема: флажки на экране не обновляются — мне нужно было бы вызвать какой-то invalidate в представлении или что-то в этом роде.
Вот мой текущий код:
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();
}
Этот код работает нормально, но мне нужно каким-то образом обновить представление, чтобы сразу увидеть результат (а не только после закрытия и повторного запуска операции настройки).
Спасибо всем за любой совет!
Ответ №1:
Это потому, что вы на самом деле не захватываете объекты предпочтений, а только фактические значения. Попробуйте это в своих циклах 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 () сделает это за вас.
Также проверьте это.
Комментарии:
1. Просто для информации: хотя этот код устарел от HoneyComb, он будет работать до ICS, но не работает с Jelly Bean.
2. Какая часть не работает с Jelly Bean? Я проверил
findPreference
иsetChecked
, и они не помечены как устаревшие по состоянию на 4.1.1.3. Хорошая информация, спасибо. Таким образом можно упростить код и исключить переменную:
((CheckBoxPreference)pref).setChecked(theValue);
Ответ №2:
Теперь у меня есть этот рабочий код, может быть, это кому-нибудь поможет:
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);
}
}
}
}