我正在尝试让现有的 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)
}
关于java - Android 自定义首选项值未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6350808/