传递稍后(不跟随)片段所需数据的最佳方式?
Best way to pass data needed for a later (not following) fragment?
我有一个应用程序需要在完成其主要工作之前收集一些数据。
因此,第一个片段收集数据,第二个片段收集数据,然后第三个片段使用数据。
问题是:第一个片段中的数据与我在第二个片段中收集的数据不相关。
如何将数据从第一个片段传递到第三个片段?我应该递增地传递我在下一个片段参数中收集的所有数据,还是应该将它们存储在其他地方?我真的很想知道最佳做法是什么。
explicative image
我不会使用数据库,因为我不需要永久存储数据。
谢谢!
至于任何最佳实践,最佳答案是“视情况而定”。
如果您的应用真的很小很简单,那么可以在参数包中将数据从一个屏幕传递到另一个屏幕。
一种更复杂的方法是将数据存储在这些 Fragment
生命周期之外的某个地方。
这是您可以根据需要实施的一般规则。下面是几个例子:
- 数据可以存储在
Application
class 级别。 Application
class 运行 用于所有应用程序生命周期。每个片段都可以从其 activity 中获取 Application
实例,例如 activity?.getApplication()
.
- 如果所有片段 运行 都在一个 activity 中,数据可以存储在
Activity
级别。 Activity
可以使用 activity
或 requireActivity()
从 Fragment
获得。
- 如果父片段中的所有片段 运行,则数据可以存储在父片段级别。它可以使用
parentFragment
. 从子片段中获得
所有这些方法都假设您将一些“父”事物转换为特定的接口或实现。例如,如果 MainActivity
中的片段 运行 存储了一些 val data: Data
作为其 属性,那么您应该像这样使用它:(requireActivity() as MainActivity).data
对几个流行答案的澄清:
Shared ViewModel
只是 activity 级方法的一个特例,因为 ViewModel
实例存储在 Activity
范围内。
- 与任何“数据库”方法一样,
SharedPrefrences
是应用程序级方法的特例,因为无论您在何处创建其实例,SharedPreferences 都存储在应用程序级(在文件存储中)。 (并且 SharedPreferences 会在应用程序启动时保留数据,所以这不是你的选择)
除了提到的“Shared ViewModel”技术之外,Androidx 还引入了新的“Fragment result Api" starting with "Fragment”库 v1.3.0-alph04(目前处于测试阶段),可用于 Fragment 对或 Activity-片段.
A Fragment/Activity 通过指定键在 FragmentManager
中设置监听器,其他 Fragment/Activity 使用该键向监听器发送数据(以 Bundle
的形式) .如果密钥没有侦听器,FragmentManager
会保留最新数据,直到侦听器注册为止。
注意 listener 和 result 必须设置在同一个 FragmentManager
实例上。
我个人认为,它对信号(事件)有好处,但不适合共享数据。我发现它有用的一种情况是将“onWindowFocusChanged”从 Activity 发送到 Fragment。在共享数据的情况下,Shared ViewModel 更好。
我有一个应用程序需要在完成其主要工作之前收集一些数据。 因此,第一个片段收集数据,第二个片段收集数据,然后第三个片段使用数据。 问题是:第一个片段中的数据与我在第二个片段中收集的数据不相关。 如何将数据从第一个片段传递到第三个片段?我应该递增地传递我在下一个片段参数中收集的所有数据,还是应该将它们存储在其他地方?我真的很想知道最佳做法是什么。
explicative image
我不会使用数据库,因为我不需要永久存储数据。 谢谢!
至于任何最佳实践,最佳答案是“视情况而定”。
如果您的应用真的很小很简单,那么可以在参数包中将数据从一个屏幕传递到另一个屏幕。
一种更复杂的方法是将数据存储在这些 Fragment
生命周期之外的某个地方。
这是您可以根据需要实施的一般规则。下面是几个例子:
- 数据可以存储在
Application
class 级别。Application
class 运行 用于所有应用程序生命周期。每个片段都可以从其 activity 中获取Application
实例,例如activity?.getApplication()
. - 如果所有片段 运行 都在一个 activity 中,数据可以存储在
Activity
级别。Activity
可以使用activity
或requireActivity()
从Fragment
获得。 - 如果父片段中的所有片段 运行,则数据可以存储在父片段级别。它可以使用
parentFragment
. 从子片段中获得
所有这些方法都假设您将一些“父”事物转换为特定的接口或实现。例如,如果 MainActivity
中的片段 运行 存储了一些 val data: Data
作为其 属性,那么您应该像这样使用它:(requireActivity() as MainActivity).data
对几个流行答案的澄清:
Shared ViewModel
只是 activity 级方法的一个特例,因为ViewModel
实例存储在Activity
范围内。- 与任何“数据库”方法一样,
SharedPrefrences
是应用程序级方法的特例,因为无论您在何处创建其实例,SharedPreferences 都存储在应用程序级(在文件存储中)。 (并且 SharedPreferences 会在应用程序启动时保留数据,所以这不是你的选择)
除了提到的“Shared ViewModel”技术之外,Androidx 还引入了新的“Fragment result Api" starting with "Fragment”库 v1.3.0-alph04(目前处于测试阶段),可用于 Fragment 对或 Activity-片段.
A Fragment/Activity 通过指定键在 FragmentManager
中设置监听器,其他 Fragment/Activity 使用该键向监听器发送数据(以 Bundle
的形式) .如果密钥没有侦听器,FragmentManager
会保留最新数据,直到侦听器注册为止。
注意 listener 和 result 必须设置在同一个 FragmentManager
实例上。
我个人认为,它对信号(事件)有好处,但不适合共享数据。我发现它有用的一种情况是将“onWindowFocusChanged”从 Activity 发送到 Fragment。在共享数据的情况下,Shared ViewModel 更好。