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, чтобы увидеть, что происходит:

  1. Слушатель работает нормально, работает, когда ожидается

  2. Моя сводная переменная содержит то, что ожидается

  3. После вызова setSummary (summary) getSummary() возвращает ожидаемое значение (так что это означает, что оно установлено правильно)

  4. Однако, когда я нажимаю и вижу "Список исключений", его сводка фактически не обновляется!

Я что-то пропустил? Заранее спасибо!

Весь код для справки:

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);
}
Другие вопросы по тегам