Android 有没有办法使用PreferenceActivity而不在共享首选项中存储值

Android 有没有办法使用PreferenceActivity而不在共享首选项中存储值,android,sharedpreferences,Android,Sharedpreferences,我有一个android应用程序,它很少使用可序列化类 (我可以使用Google Gson库以JSON格式存储和加载它们,它的工作方式非常好) 现在我想为用户提供一种类似于PreferenceActivity的方式来编辑这些对象——它们包含很少的字符串、整数和双精度,PreferenceScreen似乎非常适合编辑它们 有没有一种方法可以“滥用”首选项活动来提供编辑对象的UI,而不实际将数据存储在共享首选项中 例如,如果在保存数据之前调用了某个回调来覆盖,那么我可以提取数据、组装对象并以某种方式防

我有一个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。