扩展 FragmentStateAdapter 时每个构造函数有什么区别?

Rod*_*ina 3 android view android-fragments android-viewpager android-viewpager2

我正在学习片段,在我正在制作的应用程序中,我有一个底部导航栏,第一个导航栏有一个带有 ViewPager2 的片段。对于 viewpager2,我创建了一个扩展 FragmentStateAdapter 的自定义适配器,首先我使用了接收 FragmentActivity 的构造函数,然后使用了接收 FragmentManager 和 Lifecycle 的构造函数。我使用它们的方式是这样的:

CustomAdapter adapter = new CustomAdapter(getActivity());
CustomAdapter adapter = new CustomAdapter(getChildFragmentManager(), getLifeCycle());
Run Code Online (Sandbox Code Playgroud)

两者似乎都工作正常,但我想知道使用其中之一有什么区别,以及为什么在第二个适配器上使用 getChildFragmentManager() 而不是 getFragmentManager() 。

旁注:需要明确的是,我一次只使用了一个构造函数。

ian*_*ake 9

实际上有三个构造函数FragmentStateAdapter

  • FragmentStateAdapter(FragmentActivity)- 这使用 ActivitygetSupportFragmentManager()和 Activity 的getLifecycle(). ViewPager2如果您直接托管在活动中,这就是您将使用的
  • FragmentStateAdapter(Fragment)- 这使用 FragmentgetChildFragmentManager()和 Fragment getLifecycle()ViewPager2如果您托管在另一个 Fragment 中,这就是您会使用的
  • FragmentStateAdapter(FragmentManager, Lifecycle)- 这是其他两个构造函数在内部调用的内容。FragmentActivity除非您将片段添加到根本没有的服务等,否则您永远不会使用它。

在片段中托管 a 时,您必须始终使用带有 a 的片段Fragment(如果您想为相同效果编写更多代码,则使用getChildFragmentManager()+ ) - 这可确保您创建的片段在配置更改或处理后正确恢复其状态死亡或娱乐——只有当它们是包含你的片段的子片段时才有可能。getLifecycle()ViewPager2FragmentStateAdapterViewPager2