我正在尝试使现有的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 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)
}