java - Android 自定义首选项值未保存

标签 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 .根据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/

相关文章:

android - 如何使用 QueryBuilder 获取 GreenDAO 中列的最大值?

android - 通过上下文操作栏获取 WebView 中的选定文本

java - 如何在同一项目中连接两个数据库 MySQL 和 MongoDB?是否可以?

Java程序写入文本文件,使用分隔符,并在第一行写入记录号

java.lang.IllegalArgumentException : Element not allowed

java - ENOENT (No such file or directory) 当那里有文件时

java - 静态 block 中的 getResourceAsStream 有时返回 null

Java、Swing、获取和更改所有输入字段

android - 如何为启动器设置不同的标签而不是 Activity 标题?

android - 使 Android 源代码中的应用程序编译为系统/应用程序而不是数据/应用程序?