如何将 FragmentFactory 与 FragmentStatePagerAdapter 一起使用
How can I use FragmentFactory with FragmentStatePagerAdapter
我喜欢 FragmentFactory
的方法,它可以将依赖项传递给构造函数中的片段。
我想将自定义 FragmentFactory
与 FragmentStatePagerAdapter
一起使用。
我在 activity 中托管视图寻呼机。我可以创建一个自定义片段工厂并将其分配给 activity 使用
supportFragmentManager.fragmentFactory = CustomFragmentFactory()
然后我可以使用 supportFragmentManager
来初始化我的 FragmentStatePagerAdapter
。
到目前为止还不错。
我的问题是视图寻呼机中的片段显示的数据取决于位置。
假设我有一个列表 items
和 ItemFragment
,它显示在显示 items[position]
的视图寻呼机中,因此有一个这样的构造函数:
class ItemFragment(val item: Item) : Fragment()
我必须如何实现 CustomFragmentFactory
和 FragmentStatePagerAdapter
的 getItem(position: Int)
函数才能安全地等效于此:
override fun getItem(position: Int) = ItemFragment(items[position])
首先,FragmentStatePagerAdapter 现已弃用。因此,最好将 FragmentStateAdapter 与 ViewPager2 结合使用。
如果您需要使用 ViewPager2 将某些内容传递给 Fragment 的构造函数,我找不到任何合适的解决方案,因为它忽略了 FragmentFactory。我正在考虑在 FragmentStateAdapter 的 createFragment 方法中实现 FragmentFactory,但在这种情况下不知道从哪里获得正确的 class 加载器。
我找到的唯一解决方案是使用 FragmentManager.FragmentLifecycleCallbacks。这里有一个片段,因此您可以将其转换为特定的实现。您可以在(重新)创建片段后为片段设置回调或任何您想要的内容。所以在这种情况下,您不需要将某些内容传递给片段的构造函数,但也可以避免创建 Bundle。
fragmentManager?.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPreCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
super.onFragmentPreCreated(fm, f, savedInstanceState)
}
}, true)
我使用 childFragmentManager 测试了这段代码,它工作正常。但我不得不承认,这不是一个明确的解决方案。如果您可以在使用 FragmentStateAdapter 时避免将某些内容传递给 Fragment 的构造函数,请避免使用它。因为最合适的解决方案是使用 FragmentFactory。
此外,作为一个选项,您的片段知道父 Activity。因此,您可以直接对父 Activity.
进行回调
FragmentFactory
不提供传递动态数据的方法。因此,FragmentFactory
在这种情况下不起作用。
如果您有动态参数,则必须使用捆绑包以经典方式传递它们(或使用类似 Safe Args 的方法,它使用捆绑包生成代码)。
This article 谈论完全相同的场景:
The limitation of using FragmentFactory is that we can’t pass dynamic arguments to it.
Let’s say we have a ViewPager that display’s two instances of the same mainFragment but with different textToDisplay values then this won’t be possible using the fragmentFactory implementation.
我喜欢 FragmentFactory
的方法,它可以将依赖项传递给构造函数中的片段。
我想将自定义 FragmentFactory
与 FragmentStatePagerAdapter
一起使用。
我在 activity 中托管视图寻呼机。我可以创建一个自定义片段工厂并将其分配给 activity 使用
supportFragmentManager.fragmentFactory = CustomFragmentFactory()
然后我可以使用 supportFragmentManager
来初始化我的 FragmentStatePagerAdapter
。
到目前为止还不错。
我的问题是视图寻呼机中的片段显示的数据取决于位置。
假设我有一个列表 items
和 ItemFragment
,它显示在显示 items[position]
的视图寻呼机中,因此有一个这样的构造函数:
class ItemFragment(val item: Item) : Fragment()
我必须如何实现 CustomFragmentFactory
和 FragmentStatePagerAdapter
的 getItem(position: Int)
函数才能安全地等效于此:
override fun getItem(position: Int) = ItemFragment(items[position])
首先,FragmentStatePagerAdapter 现已弃用。因此,最好将 FragmentStateAdapter 与 ViewPager2 结合使用。
如果您需要使用 ViewPager2 将某些内容传递给 Fragment 的构造函数,我找不到任何合适的解决方案,因为它忽略了 FragmentFactory。我正在考虑在 FragmentStateAdapter 的 createFragment 方法中实现 FragmentFactory,但在这种情况下不知道从哪里获得正确的 class 加载器。
我找到的唯一解决方案是使用 FragmentManager.FragmentLifecycleCallbacks。这里有一个片段,因此您可以将其转换为特定的实现。您可以在(重新)创建片段后为片段设置回调或任何您想要的内容。所以在这种情况下,您不需要将某些内容传递给片段的构造函数,但也可以避免创建 Bundle。
fragmentManager?.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPreCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
super.onFragmentPreCreated(fm, f, savedInstanceState)
}
}, true)
我使用 childFragmentManager 测试了这段代码,它工作正常。但我不得不承认,这不是一个明确的解决方案。如果您可以在使用 FragmentStateAdapter 时避免将某些内容传递给 Fragment 的构造函数,请避免使用它。因为最合适的解决方案是使用 FragmentFactory。
此外,作为一个选项,您的片段知道父 Activity。因此,您可以直接对父 Activity.
进行回调FragmentFactory
不提供传递动态数据的方法。因此,FragmentFactory
在这种情况下不起作用。
如果您有动态参数,则必须使用捆绑包以经典方式传递它们(或使用类似 Safe Args 的方法,它使用捆绑包生成代码)。
This article 谈论完全相同的场景:
The limitation of using FragmentFactory is that we can’t pass dynamic arguments to it.
Let’s say we have a ViewPager that display’s two instances of the same mainFragment but with different textToDisplay values then this won’t be possible using the fragmentFactory implementation.