Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何杀死由NavHostFragment创建的所有碎片?_Android_Kotlin_Android Architecture Navigation_Back Stack - Fatal编程技术网

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

Android 如何杀死由NavHostFragment创建的所有碎片?,android,kotlin,android-architecture-navigation,back-stack,Android,Kotlin,Android Architecture Navigation,Back Stack,我有2个导航文件,在我的活动中有2个片段s。其中一个导航始终显示在其中一个片段中,但我仅在需要时才显示另一个 它们的绘制方式是,始终显示的片段位于relativeLayout内,而另一个片段位于同一relativeLayout内,其可见性设置为gone。当我需要第二次导航时,我将可见性设置为visible,当我不需要它时,我将其再次设置为gone。视觉效果很好,但我想完成的是,当我不需要第二次导航时,我想完全杀死它,并在下次需要时重新绘制它 到目前为止,我所做的是获得用于启动导航的NavHost

我有2个
导航
文件,在我的
活动
中有2个
片段
s。其中一个导航始终显示在其中一个片段中,但我仅在需要时才显示另一个

它们的绘制方式是,始终显示的片段位于relativeLayout内,而另一个片段位于同一relativeLayout内,其可见性设置为
gone
。当我需要第二次导航时,我将可见性设置为
visible
,当我不需要它时,我将其再次设置为
gone
。视觉效果很好,但我想完成的是,当我不需要第二次导航时,我想完全杀死它,并在下次需要时重新绘制它

到目前为止,我所做的是获得用于启动导航的
NavHostFragment
,当我不再需要它时,在它的
navController
上调用
popBackStack()
,但它不起作用:

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创建的片段呢?

NavController
维护自己的后台堆栈,独立于
FragmentManager
后台堆栈

不带参数的
popBackStack()
只会将该堆栈向后弹出一次:

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

而内容如下:

尝试将控制器的后堆栈弹出回特定目标

  • destinationId
    int:要保留的最上面的目的地
  • inclusive
    boolean:是否也应弹出给定的目标
所以这应该是:

navController.popBackStack(R.id.startDestination, true)

我想知道为什么要使用两个
NavController
,因为可以在运行时使用以下设置图形:

将导航图设置为指定的图。
将替换任何当前导航图数据(包括后堆栈)


问题是我没有一个
startDestination
。我只想完全杀死并删除由
NavHostFragment
创建的、在
navigation
文件中定义的所有片段,因为我不再需要它们了。我需要打开背景中的一个片段,此时,将所有片段集成到一个
navigation
文件中是不可行的。