2011-06-14 60 views
6

我试图让现有的首选项子类工作,保存颜色值。我没有写这个类,但它应该在android-7及更高版本上工作(我正在编译为android-9目标)。完整的源代码是available here。这里就是偏好保存:未保存Android自定义首选项值

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

使用调试输出,我可以告诉大家,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; 
} 

这是为什么,我该如何确保首选项被保留?

+0

FWIW,这里是我的了'ColorMixer'部件项目,还打包为'ColorPreference':https://github.com/commonsguy/cwac-colormixer的链接 – CommonsWare 2011-06-14 22:52:59

+0

谢谢,我已经看过你的,但决定反对它,因为虽然RGB滑块可用于非触摸屏手机,但我的应用程序无论如何都需要触摸屏,而且我更喜欢某种HSL选择器。 – tmandry 2011-06-15 03:47:07

回答

8

经过许多无望的搜索之后,我终于发现问题:由于我的首选项XML文件中存在简单的拼写错误,因此首选项值未分配给一个键。 (我用android.key代替android:key

由于Android试图坚持说没有密钥的偏好时,不会向您发出警告(只是默默地失败,而不是),你应该调用,而不是isPersistent()shouldPersist()函数试图坚持之前一个值,如果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) 
} 
+0

有同样的问题花了几小时,感谢 – Michal 2016-01-28 23:16:17