Я отправляю этот вопрос снова, так как в последний раз я не получил никаких ответов, и я до сих пор не решил проблему.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() я устанавливаю сводку «списка исключений» в строку «summary», которую я построил (которая содержит правильное значение), но она не обновляет ее! Когда я вернусь из своего меню флажка, «Список исключений» не имеет обновленных значений.
Последние несколько строк являются интересными. Я сделал несколько printlns, чтобы увидеть, что происходит:
Слушатель работает отлично, работает, когда ожидается
Мое резюме вар содержит то, что ожидается
После вызова setSummary (резюме), в 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
}
}
}
}
Это не сработало – user1429039