Добавление Android OnPreferenceChangeListener в MultiSelectListPreference (MSLP) останавливает работу MSLP

Мой минимальный SDK — Android 4.0. Когда я пытаюсь добавить OnPreferenceChangeListener в MultiSelectListPreference, MSLP не может сохранить измененные значения. Он отлично работает без слушателя, и даже с моим закомментированным кодом, похоже, он не работает.

private void init () {
    MultiSelectListPreference multiSelectListPref = (MultiSelectListPreference) findPreference("repeat_days");
    if (multiSelectListPref != null) {

/* Works fine if this is commented out
            multiSelectListPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    //formatSummary((MultiSelectListPreference) preference, newValue);
                    return false;
                }
            });*/
        }
    }

Мне нужно знать, когда пользователь меняет информацию. Я видел этот ответ, MultiSelectListPreference, не сохраняющий значения?, но мне кажется, что заставить даже это работать.

Любая помощь приветствуется, Заранее спасибо!


person Andrew No    schedule 29.11.2014    source источник


Ответы (1)


Вы можете просмотреть код Google здесь (https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/preference/MultiSelectListPreference.java). Соответствующий метод:

@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult && mPreferenceChanged) {
        final Set<String> values = mNewValues;
        if (callChangeListener(values)) {
            setValues(values);
        }
    }
    mPreferenceChanged = false;
}

Поэтому, когда вы возвращаете false в методе onPreferenceChange(), вы явно указываете ему не сохранять обновленные значения. Верните true, и это должно делать то, что вы ожидаете.

Другие сообщения SO предполагают, что в реализации этой настройки на разных уровнях SDK были различные ошибки. YMMV.

person John Vinopal    schedule 30.11.2015