我正在尝试使用现有的Preference子类来保存颜色值.我没有编写类,但它应该在android-7及更高版本上工作(我正在编译为android-9目标.)完整的源代码可以在这里找到.这是保存首选项的位置:
@Override
public void onColorChanged(int color) {
if (isPersistent()) {
boolean ret = persistInt(color);
}
// (update preview box, other stuff)
}
Run Code Online (Sandbox Code Playgroud)
使用调试输出我可以告诉isPersistent()返回true,但persistInt()返回false.根据Android文档,persistInt()返回首选项是否持久; 这些如何回归不同的价值?(注意:setPersistent(true)从构造函数中显式调用.)
在任何情况下,都不会保存该值.一个调用getPersistedInt(defaultValue)返回默认值,甚至稍后在同一个类的实例中.在下面的代码中,getPersistedInt()始终调用并始终返回mDefaultValue.
public int getValue() {
try {
if (isPersistent()) {
mValue = getPersistedInt(mDefaultValue);
}
} catch (ClassCastException e) {
mValue = mDefaultValue;
}
return mValue;
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我怎样才能确保首选项保持不变?
经过大量无望的搜索,我终于找到了问题:由于我的首选项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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2592 次 |
| 最近记录: |