来自 viewpager2 的 SharedViewModel 和我的父片段
SharedViewModel from viewpager2 and my parent Fragment
所以,我有一个片段,我们称之为片段 A,我需要它作为我的共享视图模型的主要宿主。
原来我是这样的
class FragmentA:Fragment() {
private val model: SharedViewModel by viewModels()
}
现在,在片段 A 中,我设置了 viewpager2 适配器
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()
}
在这里,我在 viewpager 中实例化了 FragmentProduct,它位于 Fragment A 中,但我的适配器需要 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]
}
}
因此,从 FragmentA 中包含的 FragmentProducts,我需要与此视图模型共享数据,但是当我这样做是为了将此片段中的数据共享到 FragmentA
class FragmentProducts:Fragment(){
private val model: SharedViewModel by viewModels ({requireParentFragment()})
}
我收到以下错误
java.lang.IllegalStateException: Fragment FragmentProducts{6953da8}
(3a2f5cbb-113d-4ed2-8f85-56e04fcea356) f0} is not a child Fragment, it
is directly attached to com.example.MainActivity@dcc2679
所以,这告诉我 FragmentProducts 引用了我的 MainActivity,这就是逻辑,因为适配器的实例在
处为 FragmentActivity 使用 requireActivity()
viewPager2.adapter = MyViewPageAdapter(requireActivity(),fragmentList)
因此,我需要传递而不是 requireActivity() 我的 FragmentA 作为此 viewpager 片段的宿主,但在我的 ViewPagerAdapter 中,我无法传递 FragmentStatePagerAdapter 或其他东西来传递我的 FragmentA 作为该 viewpager 的上下文
由于我使用的是 viewpager2,有没有办法让 FragmentA 托管 FragmentProducts viewpager,这样我就可以像这样在我的 FragmentProducts 中获取它
private val model: SharedViewModel by viewModels ({requireParentFragment()})
谢谢
您正在使用 FragmentStateAdapter(fragmentActivity)
。不要那样做。将您的父 Fragment 传递给 MyViewPageAdapter
并将 that 传递给 FragmentStateAdapter
.
class MyViewPageAdapter(
parentFragment: Fragment,
private val fragmentList: List<FragmentProducts>
) : FragmentStateAdapter(parentFragment) {
所以,我有一个片段,我们称之为片段 A,我需要它作为我的共享视图模型的主要宿主。
原来我是这样的
class FragmentA:Fragment() {
private val model: SharedViewModel by viewModels()
}
现在,在片段 A 中,我设置了 viewpager2 适配器
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()
}
在这里,我在 viewpager 中实例化了 FragmentProduct,它位于 Fragment A 中,但我的适配器需要 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]
}
}
因此,从 FragmentA 中包含的 FragmentProducts,我需要与此视图模型共享数据,但是当我这样做是为了将此片段中的数据共享到 FragmentA
class FragmentProducts:Fragment(){
private val model: SharedViewModel by viewModels ({requireParentFragment()})
}
我收到以下错误
java.lang.IllegalStateException: Fragment FragmentProducts{6953da8} (3a2f5cbb-113d-4ed2-8f85-56e04fcea356) f0} is not a child Fragment, it is directly attached to com.example.MainActivity@dcc2679
所以,这告诉我 FragmentProducts 引用了我的 MainActivity,这就是逻辑,因为适配器的实例在
处为 FragmentActivity 使用 requireActivity()viewPager2.adapter = MyViewPageAdapter(requireActivity(),fragmentList)
因此,我需要传递而不是 requireActivity() 我的 FragmentA 作为此 viewpager 片段的宿主,但在我的 ViewPagerAdapter 中,我无法传递 FragmentStatePagerAdapter 或其他东西来传递我的 FragmentA 作为该 viewpager 的上下文
由于我使用的是 viewpager2,有没有办法让 FragmentA 托管 FragmentProducts viewpager,这样我就可以像这样在我的 FragmentProducts 中获取它
private val model: SharedViewModel by viewModels ({requireParentFragment()})
谢谢
您正在使用 FragmentStateAdapter(fragmentActivity)
。不要那样做。将您的父 Fragment 传递给 MyViewPageAdapter
并将 that 传递给 FragmentStateAdapter
.
class MyViewPageAdapter(
parentFragment: Fragment,
private val fragmentList: List<FragmentProducts>
) : FragmentStateAdapter(parentFragment) {