Android: SharedPreferences не обновляется из PreferenceFragment
Я снова отправляю этот вопрос, так как в прошлый раз я не получил никаких ответов, и я до сих пор не решил проблему.
У меня есть меню настроек с PreferenceScreen, в котором я создаю много CheckBoxPreferences во время выполнения (добавляя их в предварительный экран "Список исключений"). Я создал их без проблем, вот код XML ниже, который начинается с:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:key="exclusion_list_key"
android:title="Exclusion List"
android:persistent="true"
android:summary="" >
</PreferenceScreen>
</PreferenceScreen>
Я создаю флажки в методе onCreate моего PreferenceFragment и добавляю их в PreferenceScreen "Список исключений", и это прекрасно работает.
Я пытаюсь установить в сводке "Список исключений" список всех отмеченных флажков (поэтому, если флажок установлен, его имя будет отображаться в сводке "Списка исключений").,
В методе onCreate() сводка устанавливается правильно, проблем нет.
Но в методе onPreferenceChanged() я установил для сводки "Список исключений" строку "итоговой", которую я построил (которая содержит правильное значение), но она не обновляет ее! Когда я нажимаю обратно из меню своего флажка, "Список исключений" не имеет обновленных значений.
Последние несколько строк представляют интерес. Я сделал несколько printlns, чтобы увидеть, что происходит:
Слушатель работает нормально, работает, когда ожидается
Моя сводная переменная содержит то, что ожидается
После вызова setSummary (summary) getSummary() возвращает ожидаемое значение (так что это означает, что оно установлено правильно)
Однако, когда я нажимаю и вижу "Список исключений", его сводка фактически не обновляется!
Я что-то пропустил? Заранее спасибо!
Весь код для справки:
public class Settings extends AppCompatActivity {
public static final String EXC_LIST_KEY = "exclusion_list_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
String summary = "";
//Create all the checkboxes inside of the PreferenceScreen
for (int i = 0; i < MainActivity.contactNames.length; i++) {
CheckBoxPreference checkbox = new CheckBoxPreference(getActivity());
checkbox.setTitle(MainActivity.contactNames[i][0]);
checkbox.setKey(MainActivity.contactNames[i][2]);
checkbox.setSummary(MainActivity.contactNames[i][1]);
checkbox.setDefaultValue(false);
((PreferenceScreen) findPreference(EXC_LIST_KEY)).addPreference(checkbox);
if (checkbox.isChecked()) {
summary = summary + checkbox.getTitle() + "\n";
}
}
findPreference(EXC_LIST_KEY).setSummary(summary);
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
//Checkbox keys all start with 'key_'
if (key.startsWith("key_")) {
String summary = "";
for (int i = 0; i < MainActivity.contactNames.length; i++) {
CheckBoxPreference checkbox = (CheckBoxPreference) findPreference(MainActivity.contactNames[i][2]);
if (checkbox.isChecked()) {
summary = summary + checkbox.getTitle() + "\n";
}
}
System.out.println("Summary I have: " + summary); //Correct summary is printed out
findPreference(EXC_LIST_KEY).setSummary(summary); //Isn't updating the value???
System.out.println("Summary system has: " + findPreference(EXC_LIST_KEY).getSummary()); //Correct summary is printed out
}
}
}
}
2 ответа
Получилось, добавив следующую строку кода в конец моего метода onSharedPreferenceChanged():
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
Попробуйте добавить этот код в свой SettingsFragment
@Override
public void onResume() {
super.onResume();
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
// CHANGE 1: load saved values to set the summaries
onSharedPreferenceChanged(prefs, "exclusion_list_key");
// CHANGE 2: register shared prefs listener in onResume
prefs.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
prefs.unregisterOnSharedPreferenceChangeListener(this);
}