如何杀死由NavHostFragment创建的所有片段?

问题描述 投票:0回答:1

我有2个navigation文件,在我的Activity中有2个fragment。其中一个导航始终显示在其中一个片段中,但是只有在需要时才显示另一个。

它们的绘制方式是,始终显示的片段位于relativeLayout内,另一个片段位于[RemoveLayout]中,其visibility设置为gone。当我需要第二个导航时,我将可见性设置为visible,当我不需要它时,我再次将其设置为gone。从视觉上看,这很好,但是我想实现的是当我不需要想要第二个导航,我想完全杀死它,并在下次需要它时重新绘制它。

[到目前为止,我已经掌握了用于启动导航的NavHostFragment,当我不再需要它时,请在popBackStack()上调用navController,但它不起作用:

val navHost: NavHostFragment? = null

fun createSecondNav() {
   navHostLogin = NavHostFragment.create(R.navigation.navigation_second)

   theFragment.visibility = View.VISIBLE

   supportFragmentManager.beginTransaction()
       .replace(R.id.theFragment, navHostLogin!!)
       .commit()
}

fun killSecondNav() {
   theFragment.visibility = View.GONE
   navHostLogin?.navController?.popBackStack() // returns false
   navHostLogin = null
}

那么我如何完全杀死第二个navHost创建的碎片?

android kotlin android-architecture-navigation back-stack
1个回答
0
投票

[NavController维护它自己的后置堆栈,独立于FragmentManager后置堆栈。

并且popBackStack()不带参数只会在堆栈中弹出一次:

尝试弹出控制器的后堆栈。类似于当关联的导航主机具有焦点时用户按下系统的“后退”按钮。

popBackStack(int destinationId, boolean inclusive)读为:

尝试将控制器的后退栈弹出到特定的目的地。

  • [popBackStack(int destinationId, boolean inclusive) int:要保留的最高目标位置
  • destinationId布尔值:是否还应该弹出给定的目的地。

所以应该是:

inclusive
© www.soinside.com 2019 - 2024. All rights reserved.