Значение пользовательских предпочтений Android не сохраняется

Я пытаюсь получить существующий подкласс предпочтений для работы, который сохраняет значение цвета. Я не писал класс, но он должен работать на android-7 и выше (я компилирую цель android-9.) Полный исходный код здесь. Вот где сохраняется предпочтение:

@Override
public void onColorChanged(int color) {
    if (isPersistent()) {
        boolean ret = persistInt(color);
    }
    // (update preview box, other stuff)
}

используя отладочный вывод, я могу сказать, что isPersistent() возвращает true, а persistInt() возвращает false. Согласно документация для Android, persistInt() возвращает, является ли предпочтение постоянным; как они могут возвращать разные значения? (Примечание:setPersistent(true) явно вызывается из конструктора.)

в любом случае, значение не сохраняется. Вызов getPersistedInt(defaultValue) возвращает значение по умолчанию, даже позже в тот же экземпляр класса. В приведенном ниже коде getPersistedInt() всегда вызывается и всегда возвращается mDefaultValue.

public int getValue() {
    try {
        if (isPersistent()) {
            mValue = getPersistedInt(mDefaultValue);
        }
    } catch (ClassCastException e) {
        mValue = mDefaultValue;
    }

    return mValue;
}

почему это, и как я могу убедиться, что предпочтение сохраняется?

1 ответов


после множества безнадежных поисков я, наконец, нашел проблему: значение предпочтения не было назначено ключу из-за простой опечатки в XML-файле моих предпочтений. (Я использовал android.key вместо android:key.)

поскольку Android не предупреждает вас при попытке сохранить предпочтение, которое не имеет ключа (но молча терпит неудачу), вы должны вызвать вместо isPersistent() прежде чем пытаться сохранить значение, и, возможно, журнал предупреждение, если shouldPersist() возвращает false. Для пример:

@Override
public void onColorChanged(int color) {
    mValue = color;
    if (shouldPersist()) {
        persistInt(color);
    } else {
        if (isPersistent())
            Log.w("myapp", "shouldPersist() returned false. Check if this preference has a key.");
    }
    // (update preview box, other stuff)
}