我正在使用一个包含两个页面的ViewPager。ViewPager的第一个页面是MainFragment。MainFragment有一个作为bottomNavigationView
的ViewPager。每个页面都有一个FragmentContainerView
,默认情况下它们分别包含HomeFragment、CommunityFragment和NotificationFragment。
这是该项目的源代码,这是APK。因此,您可以轻松地测试和改进它。
现在,如果我在HomeFragment中,点击一个个人资料按钮,它就会转到ProfileFragment,然后再到设置等。点击返回按钮时,它会逐一完美地返回。但是其他FragmentContainerView
不会发生同样的情况。即使它们直接返回到父片段。总体而言,我无法处理不同ViewPager和片段之间的回退堆栈。
为了避免FragmentContainers
的混淆,我像这样进行了转换
val containerId = (view?.parent as ViewGroup).id
activity?.supportFragmentManager?.beginTransaction()?.add(containerId, profileFragment)?.addToBackStack(null)?.commit()
现在,MainActivity中BackPressed()的处理方式如下:
if (view_pager_main_activity?.currentItem == 0)
{
if (view_pager_main_fragment?.currentItem == 0)
{
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view_home)
val appbarHome = findViewById<AppBarLayout>(R.id.appbar_home)
val layoutManager = recyclerView?.layoutManager as LinearLayoutManager
when {
layoutManager.findFirstCompletelyVisibleItemPosition() == 0 -> {
super.onBackPressed()
}
supportFragmentManager.backStackEntryCount != 0 -> {
supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
else -> {
layoutManager.scrollToPositionWithOffset(0, 0)
appbarHome.setExpanded(true)
//recyclerView.smoothScrollToPosition(0)
}
}
}
else
{
// Otherwise, select the previous step.
view_pager_main_fragment?.setCurrentItem(view_pager_main_fragment.currentItem - 1, false)
}
}
else
{
// Otherwise, select the previous step.
view_pager_main_activity?.currentItem = view_pager_main_activity.currentItem - 1
}