【问题标题】:How to kill all fragments created by a NavHostFragment?如何杀死由 NavHostFragment 创建的所有片段?
【发布时间】:2020-02-05 11:01:42
【问题描述】:

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

它们的绘制方式是始终显示的片段位于 relativeLayout 内,而另一个片段位于同一 relativeLayout 内,其 visibility 设置为 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创建的碎片呢?

【问题讨论】:

    标签: android kotlin android-architecture-navigation back-stack


    【解决方案1】:

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

    popBackStack() 不带参数只会弹出该回栈一次:

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

    popBackStack(int destinationId, boolean inclusive) 读作:

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

    • destinationId int:要保留的最高目的地
    • inclusive boolean:给定的目的地是否也应该被弹出。

    所以应该是这样的:

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

    我想知道为什么还要使用两个NavController,因为可以在运行时使用setGraph(NavGraph graph, Bundle startDestinationArgs) 设置图形:

    将导航图设置为指定的图。
    所有当前导航图数据(包括返回堆栈)都将被替换

    【讨论】:

    • 问题是我没有startDestination 可以访问。我只想完全杀死并删除NavHostFragment 创建的所有片段,这些片段在navigation 文件中定义,因为我不再需要它们了。我需要在后台打开一个片段,此时将所有片段集成到一个navigation 文件中是不可行的。
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 2021-05-25
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2013-12-18
    相关资源
    最近更新 更多