导航组件 - BottomNavigationView - 返回时不要保留 startDestination 片段

Posted

技术标签:

【中文标题】导航组件 - BottomNavigationView - 返回时不要保留 startDestination 片段【英文标题】:Navigation Component - BottomNavigationView - Don't keep startDestination fragment when back 【发布时间】:2020-12-18 22:47:07 【问题描述】:

我正在使用导航组件和 BottomNavigationView 设置 UI。

3 个标签:主页、新闻、帐户。

当我从 Home 导航到 News(当前,Back stack 有 HomeFragment)并按下 Back 按钮时, Fragment News 将被销毁,Back stack 中的 HomeFragment 也将被销毁并创建新的 HomeFragment。我希望 Back stack 中的 HomeFragment 再次显示,不会破坏并创建新的。

我使用这个代码:

bottomNavigation.setupWithNavController(navHostFragment.findNavController())

如何解决这个问题?

谢谢。


更新问题:

当我点击菜单项时,片段将被创建新实例。我不希望这样,如果尚未单击它,我想导航到新的 Fragment,如果我再次单击菜单项,Fragment 将再次显示(不创建新的)。

【问题讨论】:

我还没有找到解决方案,请帮助我。 这能回答你的问题吗? android - PageView in new BottomNavigationBar - prevent reload fragments 解决方案是使用FragmentManager,在onCreate()中添加所有Fragments,并根据需要显示/隐藏Fragments。检查上面我提到的答案。 感谢支持,但我想将导航组件与 BottomNaviagtionView 一起使用。 这就是我分享这个答案的原因。它不使用ViewPager 【参考方案1】:

关于您更新的问题。如果您不想在重新选择时重新创建片段,只需在 BottomNavigationView 上设置 OnNavigationItemReselectedListener

    bottomNavigation.setOnNavigationItemReselectedListener  item ->
        when (item.itemId) 
            R.id.frag1-> 
                // do something on reselection or leave empty
            
            R.id.frag2-> 
                // do something on reselection or leave empty
            
        
    

【讨论】:

以上是关于导航组件 - BottomNavigationView - 返回时不要保留 startDestination 片段的主要内容,如果未能解决你的问题,请参考以下文章

导航架构组件 - 导航抽屉

如何同时使用导航抽屉和底部导航 - 导航架构组件

导航抽屉不适用于导航组件

导航架构组件 - 新资源对话框没有导航图的导航资源类型

Android - 具有多个底部导航菜单的导航组件

Android Jetpack的导航组件(Navigation组件)的使用