Android自定义偏好值未保存

时间:2011-06-14 22:16:52

标签: 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。根据{{​​3}},persistInt()返回首选项是否持久;这些如何回归不同的价值? (注意:setPersistent(true)是从构造函数中显式调用的。)

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

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

    return mValue;
}

为什么会这样,以及如何确保首选项保持不变?

1 个答案:

答案 0 :(得分:8)

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