【发布时间】:2021-03-04 20:36:57
【问题描述】:
设置是这样的:
-
带有 nav_graph 的单个活动应用 (MainActivity)
-
HomeFragment 有 viewPager2 和 3 个子片段
-
这 3 个片段中的每一个都是相同的片段,RecyclerView 显示不同的帖子列表
-
用户可以点击帖子并导航到全新的屏幕/片段(详细信息)
-
点击“返回”按钮抛出异常:
java.lang.IllegalStateException: FragmentManager 已经在执行事务 在 androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1790) 在 androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1826) 在 androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:297) 在 androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer.updateFragme
所以我的感觉是问题发生在 ViewPager2 与 RecyclerView 和 FragmentTransitions 通过导航之间。为什么?好吧,单击“返回”箭头会使事务转到“主”屏幕,但具有 viewpager 的主屏幕也会处理片段转换,这会以某种方式产生问题。
为了提供更多上下文,这是选项卡/viewpager 的设置方式(在 HomeFragment 中):
val viewPager: ViewPager2 = container.findViewById(R.id.viewPager)
viewPager.adapter = PagerAdapter(parentFragmentManager, lifecycle)
val tabLayout: TabLayout = container.findViewById(R.id.tabLayout)
val names = arrayOf("Najbolje", "Popularno", "Novo")
TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = names[position] }.attach()
这是适配器:
class PagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragmentManager, lifecycle) {
private val fragments = listOf<Fragment>(
MyListFragment.newInstance(Type.TOP),
MyListFragment.newInstance(Type.POPULAR),
MyListFragment.newInstance(Type.NEW)
)
override fun getItemCount(): Int {
return fragments.size
}
override fun createFragment(position: Int): Fragment {
return fragments[position]
}
}
这里是设置recyclerview的代码:
private fun setupRecyclerView() {
val adapter = MyListAdapter(requireContext(), myService)
binding.recyclerView.adapter = adapter
binding.recyclerView.layoutManager = layoutManager
viewModel.posts.observe(viewLifecycleOwner) { post -> adapter.submitList(posts.map { PostItem(it) }) }
addScrollListener()
}
通过在 setTabs 方法中将 parentFragmentManager 更改为 childFragmentManager 解决了一个类似的问题,但这会产生另一个问题,在“RecyclerView 已经设置 layoutManager”的行中引发异常
如果没有提供足够的信息,请告诉我。
【问题讨论】:
标签: android android-jetpack fragmentmanager android-viewpager2