1

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


解释性图像


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

4

2 回答 2

0

至于任何最佳实践,最佳答案是“视情况而定”。

如果您的应用程序非常小且简单,那么可以在参数包中将数据从一个屏幕传递到另一个屏幕。

一种更复杂的方法是将数据存储在这些Fragment生命周期之外的某个地方。这是您可以根据需要实施的一般规则。下面举几个例子:

  • 数据可以存储在Application类级别。Application类在所有应用程序生命周期中运行。每个片段都可以Application从其活动中获取实例,例如activity?.getApplication().
  • Activity如果所有片段都在单个活动中运行,则数据可以存储在级别上。Activity可以通过Fragment使用activityor获得requireActivity()
  • 如果所有片段都在此父片段中运行,则数据可以存储在父片段级别。可以使用parentFragment.

所有这些方法都假设您将一些“父”事物转换为特定的接口或实现。例如,如果您的片段在MainActivity其中存储一些val data: Data作为其属性运行,那么您应该像这样使用它:(requireActivity() as MainActivity).data

澄清几个流行的答案:

  • Shared ViewModel只是活动级别方法的一个特例,因为ViewModel实例存储在Activity范围内。
  • SharedPrefrences任何“数据库”方法一样,是应用程序级别方法的一种特殊情况,因为无论您在何处创建其实例,SharedPreferences 都存储在应用程序级别(在文件存储中)。(并且 SharedPreferences 会在应用程序启动时保留数据,因此这不是您的选择)
于 2020-11-30T10:01:17.347 回答
0

除了提到的“Shared ViewModel”技术,Androidx 还引入了新的“ Fragment result Api ”,从“ Fragment ”库 v1.3.0-alph04(目前处于测试阶段)开始,可用于 Fragment 对或 Activity-Fragment 之间的通信。

Fragment/ActivityFragmentManager通过指定一个键来设置监听器,而其他 Fragment/ActivityBundle使用该键向监听器发送数据(以 a 的形式)。如果键没有侦听器,则FragmentManager保留最新数据,直到侦听器注册为止。注意监听器和结果必须设置在同一个FragmentManager实例上。

我认为,它有利于信号(事件),而不是共享数据。我发现它很有用的一种情况是,将“onWindowFocusChanged”从 Activity 发送到 Fragment。在共享数据的情况下,Shared ViewModel 更好。

于 2020-12-09T06:55:01.297 回答