android - 如何将 FragmentFactory 与 FragmentStatePagerAdapter 一起使用
问题描述
我喜欢 的方法FragmentFactory
,它可以将依赖项传递给构造函数中的片段。
我想将自定义FragmentFactory
与FragmentStatePagerAdapter
.
我在活动中托管视图寻呼机。我可以创建一个自定义片段工厂并将其分配给使用
supportFragmentManager.fragmentFactory = CustomFragmentFactory()
然后我可以supportFragmentManager
用来初始化我的FragmentStatePagerAdapter
. 到目前为止很好。
我的问题是视图寻呼机中的片段显示的数据取决于位置。
假设我有一个列表items
and ItemFragment
,它显示在视图寻呼机中显示items[position]
,因此有一个这样的构造函数:
class ItemFragment(val item: Item) : Fragment()
我必须如何实现CustomFragmentFactory
andFragmentStatePagerAdapter
的getItem(position: Int)
功能才能实现安全的等效项:
override fun getItem(position: Int) = ItemFragment(items[position])
解决方案
首先,现在不推荐使用 FragmentStatePagerAdapter。因此,最好将 FragmentStateAdapter 与 ViewPager2 一起使用。
如果您需要使用 ViewPager2 将某些内容传递给 Fragment 的构造函数,我找不到任何合适的解决方案,因为它忽略了 FragmentFactory。我正在考虑在 FragmentStateAdapter 的 createFragment 方法中实现 FragmentFactory,但不知道在这种情况下从哪里获得正确的类加载器。
我找到的唯一解决方案是使用 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 进行回调。
推荐阅读
- javascript - 不发生反序列化
- python - 如何与相应的行一起打开和关闭图例
- r - 如何解释项目“反斜杠确实需要加倍”的包装胶水示例
- php - 取消设置后如何获取新数组?
- powerbi - “显示没有数据的项目”在折线图中不起作用,预计在表格中
- javascript - 无法访问 Vue 中的实例变量
- javascript - Vue.js 在构建文件中构建链接
- html - VS Code 使用正则表达式跨文件查找和替换以纠正出现在特定行上的引号数量错误
- ios - React Native WebView IOS Katex:本地语言文本显示为奇怪的字符
- postgresql - 无法理解 postgres 中的哈希分区