Android自定义偏好设置值未保存

6

我正在尝试让一个已存在的Preference子类工作起来,它可以保存颜色值。我没有编写这个类,但是它应该在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;
}

为什么会这样,我应该如何确保偏好设置被保存?

谢谢提供链接,我已经看过了,但最终决定不使用它,因为虽然RGB滑块对于非触摸屏手机可能很有用,但我的应用程序无论如何都需要触摸屏,并且我更喜欢一些HSL选择器。 - tmandry
1个回答

9
在经过无数次绝望的搜索后,我终于找到了问题所在:由于我的偏好设置XML文件中有一个简单的拼写错误,导致偏好设置值没有被分配关键字。(我使用了android.key而不是android:key。)
由于Android在尝试持久化没有关键字的偏好设置时不会发出警告(而是静默失败),因此在尝试持久化值之前,您应该调用shouldPersist()函数而不是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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接