Android自定义SharedReferences实现是否持久化到数据库?
我试图使用Android自定义SharedReferences实现是否持久化到数据库?,android,Android,我试图使用SharedReferences接口的自定义实现将应用程序的首选项持久化到数据库(而不是默认的XML) 为什么??我想使用PreferenceActivity的便利性来构建UI,但此应用程序将在多个设备上使用,因此用户设置的首选项需要在多个设备上保持不变 所以。。我已经编写了实现,但不知道如何将特定的SharedReference与首选项活动关联起来。我知道它使用的是getSharedReferences(),但我如何覆盖它呢?我可以以某种方式注册我的共享引用吗?我在API中没有看到任
SharedReferences
接口的自定义实现将应用程序的首选项持久化到数据库(而不是默认的XML)
为什么??我想使用PreferenceActivity
的便利性来构建UI,但此应用程序将在多个设备上使用,因此用户设置的首选项需要在多个设备上保持不变
所以。。我已经编写了实现,但不知道如何将特定的SharedReference与首选项活动关联起来。我知道它使用的是getSharedReferences()
,但我如何覆盖它呢?我可以以某种方式注册我的共享引用吗?我在API中没有看到任何可以这样做的东西
或者。。。如果我做错了,请告诉我。谢谢。不久前我一直在调查这个问题。但原因不同
我发现,PreferenceActivity
与PreferenceManager
高度耦合,它使用PreferenceManager.getDefaultSharedReferences()
深入内部获取SharedReference
实例。在preferenceactivity
中,没有办法替代自定义PreferenceManager
或SharedReference
实例
我发现偏好框架是不灵活的,很难扩展或更改默认行为,有时甚至是不可能的。但我的猜测是,这个框架的设计者将“易用性”作为他们的首要任务,而不是可扩展性和灵活性。这是可以理解的。经过一些研究,有了这个特别的需求,有了一个“简单”的解决方案
您需要重写SharedReferences和Editor以提供自己的实现,然后还必须扩展每个首选项以重写各种persistXXX()和getPersistedXXX()方法
例如,CheckBoxPreference可以覆盖persistBoolean和getPersistedBoolean来完成这项任务
遗憾的是,似乎不可能简单地扩展PreferenceManager类,然后只覆盖每个首选项类中的getPreferenceManager()。我找到了一个简单的解决方法:只需将所有首选项设置为persistent=“false”
(通过XML或代码中的Preference.setPersistent(false)
)。然后,设置OnPreferenceChangeListener
,以便在更改首选项时得到通知,并让处理程序将值存储在某个自定义数据库中
这是我的密码:
Preference preference = findPreference(getString(R.string.pref1));
Preference.OnPreferenceChangeListener changeListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
preference.setSummary((String)value + " something");
// store value in custom database
store((String)value);
return true;
}
};
preference.setOnPreferenceChangeListener(changeListener);
// update preference from custom database (once)
changeListener.onPreferenceChange(preference, getValueFromDatabase());
我正在研究存储在蓝牙设备上的首选项。我的解决方案是覆盖我的活动的GetSharedReferences方法:
@Override
public SharedPreferences getSharedPreferences (String name, int mode) {
return new MySharedPreferences(this);
}
MySharedPreference是我对android.content.SharedReferences接口的实现。您还必须实现它的内部类。在MySharedPreference构造函数中,活动作为参数传递并存储在成员变量中,这真是个麻烦。谢谢你的回复。我想我只需要编写我自己的首选项屏幕。你可以复制代码并根据需要修改它(只需保留原始包名):我想我可以这样做。相反,我为PreferenceActivity中的每个首选项设置了一个OnPreferenceChangeListener。调用时,它在单独的数据结构中设置首选项,用户注销时保存到数据库中。不要忘记调用setPersistent(false)
then()。