Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android自定义SharedReferences实现是否持久化到数据库?_Android - Fatal编程技术网

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()。