Android 有没有办法使用PreferenceActivity而不在共享首选项中存储值
我有一个android应用程序,它很少使用可序列化类 (我可以使用Google Gson库以JSON格式存储和加载它们,它的工作方式非常好) 现在我想为用户提供一种类似于PreferenceActivity的方式来编辑这些对象——它们包含很少的字符串、整数和双精度,PreferenceScreen似乎非常适合编辑它们 有没有一种方法可以“滥用”首选项活动来提供编辑对象的UI,而不实际将数据存储在共享首选项中Android 有没有办法使用PreferenceActivity而不在共享首选项中存储值,android,sharedpreferences,Android,Sharedpreferences,我有一个android应用程序,它很少使用可序列化类 (我可以使用Google Gson库以JSON格式存储和加载它们,它的工作方式非常好) 现在我想为用户提供一种类似于PreferenceActivity的方式来编辑这些对象——它们包含很少的字符串、整数和双精度,PreferenceScreen似乎非常适合编辑它们 有没有一种方法可以“滥用”首选项活动来提供编辑对象的UI,而不实际将数据存储在共享首选项中 例如,如果在保存数据之前调用了某个回调来覆盖,那么我可以提取数据、组装对象并以某种方式防
例如,如果在保存数据之前调用了某个回调来覆盖,那么我可以提取数据、组装对象并以某种方式防止Android干扰首选项 首先,我想如果我真的想用首选项UI呈现对象编辑,因为这可能会让用户感到困惑 如果您仍然决定这样做,您可以通过以下方式实现:
PreferenceManager
并使用反射替换PreferenceActivity
对于这种情况,我仍然建议将决策修改为“重复使用”
首选活动
。共享引用
是一个接口,因此您应该能够提供自己的实现,以任意方式存储数据。但是PreferenceFragment
使用的PreferenceManager
只有一个采用文件名的setter,而不是SharedReferences
的自定义实现
我查看了源代码,找到了一种使用您自己的实现的迂回方法PreferenceFragment
使用其宿主活动
作为上下文
来构建首选项管理器
PreferenceManager
随后调用Context#getSharedReferences(String,int)
以获取它将使用的SharedReferences
。因此,您可以在承载首选项片段的活动中覆盖getSharedReferences
,并返回自定义实现。实现SharedReferences
可能相当复杂,因为您还必须实现SharedReferences.Editor
,但这是可行的。如果您被覆盖的getSharedReferences
有可能被其他地方使用,您应该记录它使用了不同的备份存储
在androido预览中,有一个名为的新接口和一个以该接口为实例的新接口PreferenceDataStore
看起来比SharedPreferences
更易于实现。但在我写这篇文章时,大多数零售商仍然在销售L和M设备,所以谁知道什么时候我们会看到O。我想我会选择第一种方式。很少有额外的“虚拟”首选项不会造成伤害,它们提供了设置默认值的好方法。我不担心用户和UI混淆,因为我的对象实际上是偏好——它们是一些电子设备和传感器的存储校准参数。我正在开发一个应用程序,作为它们的接口。校准是从JSON文件加载的,但有时某些参数需要更改。PreferenceDataStore非常理想-直接序列化为JSON,我的问题就解决了:)。不幸的是,它是不可用的,即使它是应用程序必须与果冻豆兼容,所以我不能使用任何新的好东西:(.谢谢你的链接。这是一种有趣的方式。我已经使用一组虚拟首选项实现了它,每次加载对象时都会重置该首选项,然后在PreferenceActivity结束时序列化为JSON。为此重用PreferenceActivity的整个目标是不必重新实现任何大的功能(如SharedReferences).我将保持现状。如果应用程序将来需要在sommetime更新,我将使用PreferenceDataStore。