如何将 FragmentFactory 与 FragmentStatePagerAdapter 一起使用



我喜欢FragmentFactory的方法,这使得将依赖关系传递给构造函数中的片段成为可能。

我想将自定义FragmentFactoryFragmentStatePagerAdapter一起使用。

我正在活动中托管视图寻呼机。我可以创建自定义片段工厂并将其分配给活动

supportFragmentManager.fragmentFactory = CustomFragmentFactory()

然后,我可以使用supportFragmentManager来初始化我的FragmentStatePagerAdapter。 到目前为止还好。

我的问题是我在视图寻呼机中的片段显示的数据取决于位置。

假设我有一个列表itemsItemFragment,它显示在显示items[position]的视图页中,因此有一个这样的构造函数:

class ItemFragment(val item: Item) : Fragment()

我必须如何实现CustomFragmentFactoryFragmentStatePagerAdaptergetItem(position: Int)函数才能实现一个安全的等价物:

override fun getItem(position: Int) = ItemFragment(items[position])

首先,FragmentStatePagerAdapter 现已弃用。因此,最好将 FragmentStateAdapter 与 ViewPager2 一起使用。

如果您需要使用 ViewPager2 将某些内容传递到 Fragment 的构造函数中,我找不到任何合适的解决方案,因为它忽略了 FragmentFactory。我正在考虑在FragmentStateAdapter的createFragment方法中实现FragmentFactory,但在这种情况下不知道从哪里获得合适的类加载器。

我找到的唯一解决方案是使用FragmentManager.FragmentLifecycleCallbacks。在这里,您有一个片段,因此您可以将其转换为特定的实现。您可以在片段(重新(创建后对片段设置回调或任何您想要的内容。因此,在这种情况下,您不需要将某些内容传递给片段的构造函数,但也可以避免创建捆绑包。

fragmentManager?.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPreCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
super.onFragmentPreCreated(fm, f, savedInstanceState)
}
}, true)

我使用childFragmentManager测试了这段代码,它工作正常。但我不得不承认,这不是一个明确的解决方案。如果你在使用 FragmentStateAdapter 时可以避免将某些内容传递给 Fragment 的构造函数,请避免它。因为最合适的解决方案是使用碎片工厂。

此外,作为一个选项,您的片段知道父活动。因此,您可以直接对父活动进行回调。

文档链接:https://developer.android.com/reference/androidx/fragment/app/FragmentManager#registerFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks,%20boolean(

FragmentFactory

不提供传递动态数据的方法。因此,FragmentFactory在这种情况下不起作用。

如果您有动态参数,则必须使用捆绑包以经典方式传递它们(或使用像 Safe Args 这样的方法,它使用捆绑包生成代码(。

本文讨论完全相同的场景:

使用 FragmentFactory 的局限性在于我们不能将动态参数传递给它。

假设我们有一个ViewPager,它显示同一mainFragment的两个实例,但具有不同的textToDisplay值,那么使用fragmentFactory实现将无法做到这一点。

最新更新