来自 viewpager2 和我的父 Fragment 的 SharedViewModel

SNM*_*SNM 3 android android-fragments android-viewpager kotlin android-architecture-navigation

所以,我有一个片段,我们称之为片段 A,我需要它作为我的共享视图模型的主要宿主。

所以我有这样的

class FragmentA:Fragment() {

 private val model: SharedViewModel by viewModels()

}
Run Code Online (Sandbox Code Playgroud)

现在,在片段 A 中,我设置了 viewpager2 Adapter

private fun setupViewPagerWithTabLayout(
        productList: MutableList<Producto>,
        drinkList: MutableList<Producto>
    ) {
        val fragmentList = listOf(
            FragmentProducts.newInstance(productList),
            FragmentProducts.newInstance(drinkList))

        viewPager2.adapter = MyViewPageAdapter(requireActivity(),fragmentList)
        val tabLayoutMediator = TabLayoutMediator(tabLayout, viewPager2,
            TabLayoutMediator.TabConfigurationStrategy { tab, position ->

                when (position) {
                    0 -> {
                        tab.text = "Option1"
                    }
                    1 -> {
                        tab.text = "Option2"
                    }
                }

            })
        tabLayoutMediator.attach()
    }
Run Code Online (Sandbox Code Playgroud)

在这里,我实例化了位于 viewpager 中的 Fragment A 内的 FragmentProduct,但我的适配器需要 FragmentActivity

class MyViewPageAdapter(fragmentActivity: FragmentActivity,private val fragmentList: List<FragmentProducts>) :
    FragmentStateAdapter(fragmentActivity) {

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,从包含在 FragmentA 中的 FragmentProducts 中,我需要与此视图模型共享数据,但是当我这样做以将数据从此片段共享到 FragmentA 时

class FragmentProducts:Fragment(){

    private val model: SharedViewModel by viewModels ({requireParentFragment()})

}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

java.lang.IllegalStateException: Fragment FragmentProducts{6953da8} (3a2f5cbb-113d-4ed2-8f85-56e04fcea356) f0} 不是子 Fragment,它直接附加到 com.example.MainActivity@dcc2679

所以,这告诉我 FragmentProducts 引用了我的 MainActivity,这是逻辑,因为适配器的实例在 FragmentActivity 需要 requireActivity()

viewPager2.adapter = MyViewPageAdapter(requireActivity(),fragmentList)
Run Code Online (Sandbox Code Playgroud)

所以,我需要传递而不是 requireActivity() 我的 FragmentA 作为这个 viewpager 片段的宿主,但是在我的 ViewPagerAdapter,我不能传递 FragmentStatePagerAdapter 或其他东西来传递我的 FragmentA 作为该 viewpager 的上下文

由于我使用 viewpager2,有没有办法让 FragmentA 托管 FragmentProducts viewpager,这样我就可以像这样在我的 FragmentProducts 中获取它

private val model: SharedViewModel by viewModels ({requireParentFragment()})
Run Code Online (Sandbox Code Playgroud)

谢谢

ian*_*ake 20

您正在使用FragmentStateAdapter(fragmentActivity). 不要那样做。通过你的父母片段MyViewPageAdapter,并通过FragmentStateAdapter

class MyViewPageAdapter(
    parentFragment: Fragment,
    private val fragmentList: List<FragmentProducts>
) : FragmentStateAdapter(parentFragment) {
Run Code Online (Sandbox Code Playgroud)