我正在尝试使现有的Preference子类工作以节省颜色值。我没有写这个类,但是它应该在android-7及更高版本上工作(我正在编译为android-9目标。)完整的源代码是available here。这是保存首选项的位置:

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

使用debug输出,我可以知道isPersistent()返回true,但是persistInt()返回false。根据Android documentationpersistInt()返回首选项是否持久。这些如何返回不同的值? (注意: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)
}

10-07 19:16
查看更多