Android 传递稍后(而不是后续)片段所需数据的最佳方法?

Android 传递稍后(而不是后续)片段所需数据的最佳方法?,android,android-fragments,android-architecture-navigation,android-architecture,Android,Android Fragments,Android Architecture Navigation,Android Architecture,我有一个应用程序,需要收集一些数据,然后再做它的主要工作。 因此,第一个片段收集数据,第二个片段收集数据,然后第三个片段使用数据。 问题是:第一个片段中的数据与我在第二个片段中收集的数据不相关。 如何将数据从第一个片段传递到第三个片段?我应该递增地传递我在下一个片段参数中收集的所有数据,还是应该将它们存储在其他地方?我真的很想知道最好的做法是什么 我不会使用数据库,因为我不需要永久存储数据。 谢谢大家! 对于任何最佳实践,最好的答案是“视情况而定” 如果你的应用程序真的很小很简单,那么在a

我有一个应用程序,需要收集一些数据,然后再做它的主要工作。 因此,第一个片段收集数据,第二个片段收集数据,然后第三个片段使用数据。 问题是:第一个片段中的数据与我在第二个片段中收集的数据不相关。 如何将数据从第一个片段传递到第三个片段?我应该递增地传递我在下一个片段参数中收集的所有数据,还是应该将它们存储在其他地方?我真的很想知道最好的做法是什么



我不会使用数据库,因为我不需要永久存储数据。
谢谢大家!

对于任何最佳实践,最好的答案是“视情况而定”

如果你的应用程序真的很小很简单,那么在arguments bundle中将数据从一个屏幕传递到另一个屏幕是可以的

更复杂的方法是将数据存储在这些
片段
生命周期之外的某个地方。
这是一条你可以随心所欲实施的一般规则。下面有几个例子:

  • 数据可以存储在
    应用程序
    类级别<代码>应用程序
类在所有应用程序生命周期中运行。每个片段都可以从其活动(如
activity?.getApplication()
)中获取
Application
实例
  • 如果所有片段都在单个活动中运行,则数据可以存储在
    活动
    级别<代码>活动
  • 可使用
    活动
    活动()从
    片段
    获取
  • 如果所有片段都在此父片段中运行,则数据可以存储在父片段级别。它可以使用
    parentFragment
    从子片段中获得
  • 所有这些方法都假设您将某些“父”对象强制转换为特定的接口或实现。例如,如果您的片段在
    MainActivity
    中运行,它将一些
    val data:data
    存储为属性,那么您应该像这样使用它:
    (requireActivity()作为MainActivity)。data

    对几个流行答案的澄清:

    • sharedviewmodel
      只是活动级方法的一个特例,因为
      ViewModel
      实例存储在
      activity
      范围中
    • SharedReferences
      与任何“数据库”方法一样,都是应用程序级方法的特例,因为SharedReferences存储在应用程序级(文件存储中),无论您在何处创建其实例。(而且SharedReferences会在应用程序启动时保存数据,因此您不可以选择)

    对于任何最佳实践,最好的答案是“视情况而定”

    如果你的应用程序真的很小很简单,那么在arguments bundle中将数据从一个屏幕传递到另一个屏幕是可以的

    更复杂的方法是将数据存储在这些
    片段
    生命周期之外的某个地方。
    这是一条你可以随心所欲实施的一般规则。下面有几个例子:

    • 数据可以存储在
      应用程序
      类级别<代码>应用程序
    类在所有应用程序生命周期中运行。每个片段都可以从其活动(如
    activity?.getApplication()
    )中获取
    Application
    实例
  • 如果所有片段都在单个活动中运行,则数据可以存储在
    活动
    级别<代码>活动
  • 可使用
    活动
    活动()从
    片段
    获取
  • 如果所有片段都在此父片段中运行,则数据可以存储在父片段级别。它可以使用
    parentFragment
    从子片段中获得
  • 所有这些方法都假设您将某些“父”对象强制转换为特定的接口或实现。例如,如果您的片段在
    MainActivity
    中运行,它将一些
    val data:data
    存储为属性,那么您应该像这样使用它:
    (requireActivity()作为MainActivity)。data

    对几个流行答案的澄清:

    • sharedviewmodel
      只是活动级方法的一个特例,因为
      ViewModel
      实例存储在
      activity
      范围中
    • SharedReferences
      与任何“数据库”方法一样,都是应用程序级方法的特例,因为SharedReferences存储在应用程序级(文件存储中),无论您在何处创建其实例。(而且SharedReferences会在应用程序启动时保存数据,因此您不可以选择)
    除了提到的“共享视图模型”技术外,Androidx还引入了新的“从”库v1.3.0-alph04(目前处于测试阶段),可用于片段对或活动片段之间的通信

    片段/活动通过指定键在
    FragmentManager
    中设置侦听器,其他片段/活动使用该键向侦听器发送数据(以
    Bundle
    的形式)。如果没有密钥的侦听器,
    FragmentManager
    将保留最新数据,直到注册侦听器。 请注意,侦听器和结果必须设置在同一个
    FragmentManager
    实例上

    我认为,它有利于信号(事件),而不是共享数据。我发现它很有用的一种情况是将“onWindowFocusChanged”从活动发送到片段。在共享数据的情况下,共享视图模型更好。

    除了提到的“共享视图模型”技术外,Androidx还引入了新的“从”库v1.3.0-alph04(目前处于测试阶段),可用于片段对或活动片段之间的通信

    片段/活动通过指定键在
    FragmentManager
    中设置侦听器,其他片段/活动使用该键向侦听器发送数据(以
    Bundle
    的形式)。如果没有键的侦听器,
    FragmentManager
    将保留最新数据