我有一个应用程序,它的布局如下
Activity
->ViewPager
→FragmentA
→FragmentContainerView
→FragmentB
FragmentContainerView
包含一个NavHostFragment
,它通过一个nav_graph
显示FragmentB
。FragmentB
中有一个按钮,可以导航到FragmentB
的新实例。因此,导航图基本上只是一个片段,它有一个链接到自己。
现在如果我有FragmentContainerView
直接在我的活动,这工作得很好。但是,如果我将FragmentContainerView
放在ViewPager
内的另一个片段中,则后退按钮不再允许我导航FragmentB
导航图。
我在FragmentContainerView
上使用app:defaultNavHost="true"
,但它没有帮助。
你知道我做错了什么吗?我该怎么做?
根据片段管理器指南:
将导航结构视为一系列层,活动作为最外层,在下面包裹每一层的子片段。每个层必须有一个单独的主要导航片段。当Back事件发生时,最内层控制导航行为。一旦最内层没有更多的片段事务可以弹出,控制返回到下一层,这个过程重复,直到到达活动。
因此,当app:defaultNavHost="true"
在FragmentA
中设置NavHostFragment
作为其层(FragmentA
的childFragmentManager
层)的主要导航片段时,FragmentA
必须也必须为了让任何系统后退按钮事件都能到达FragmentA
,必须将其设置为主要导航片段。
同一页显示了如何做到这一点:
要在片段事务中定义主导航片段,在事务中调用
setPrimaryNavigationFragment()
方法,传入childFragmentManager
应该具有主控制的片段实例。
虽然ViewPager2
有API允许您将主要导航片段设置为当前页面,但ViewPager1没有这样的API(这是您绝对应该转移到ViewPager2的众多原因之一)。
作为ViewPager1的解决方案,FragmentA
可以将自己设置为onResume()
中的主要导航片段:
public fun onResume() {
super.onResume()
parentFragmentManager
.beginTransaction()
.setPrimaryNavigationFragment(this)
.commit()
}