java – 未保存Android自定义首选项值

我正在尝试使用现有的Preference子类来保存颜色值.我没有编写类,但它应该在 android-7及更高版本上工作(我正在编译为android-9目标.)完整的源代码available here.这是保存首选项的地方:
@Override
public void onColorChanged(int color) {
    if (isPersistent()) {
        boolean ret = persistInt(color);
    }
    // (update preview Box,other stuff)
}

使用调试输出我可以告诉isPersistent()返回true,但persistInt()返回false.根据Android documentation,persistInt()返回首选项是否持久;这些如何回归不同的价值? (注意:从构造函数中显式调用setPersistent(true).)

在任何情况下,都不会保存该值.对getPersistedInt(defaultValue)的调用将返回默认值,即使稍后在类的同一实例中也是如此.在下面的代码中,始终调用getPersistedInt()并始终返回mDefaultValue.

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

    return mValue;
}

为什么会这样,我怎样才能确保首选项保持不变?

解决方法

经过大量无望的搜索,我终于找到了问题:由于我的首选项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)
}

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...