如何使用Android导航组件处理嵌套的BottomNavigationView?

如何使用Android导航组件处理嵌套的BottomNavigationView?,android,android-architecture-navigation,android-bottomnavigationview,Android,Android Architecture Navigation,Android Bottomnavigationview,我正在使用Android导航组件(目前为v2.1.0),并且我正在尝试解决如何最好地处理需要自己的BottomNavigationView的子屏幕,MainActivity已经有了顶级的BottomNavigationView 在大多数情况下,谷歌似乎真的支持单一活动架构。以下是我目前的情况: - Main Activity - NavHostFragment & Top Level BottomNav NavHost has navGraph of main_nav

我正在使用Android导航组件(目前为v2.1.0),并且我正在尝试解决如何最好地处理需要自己的BottomNavigationView的子屏幕,MainActivity已经有了顶级的BottomNavigationView

在大多数情况下,谷歌似乎真的支持单一活动架构。以下是我目前的情况:

 - Main Activity
   - NavHostFragment & Top Level BottomNav 
     NavHost has navGraph of main_navigation.xml: this has the MainActivity top level 
     bottom navigation fragments, (e.g. Groups, Courses, Profile etc.) and also a link to the child 
     fragment which should have its own BottomNav    
       - ChildFragment
         - Has its own NavHostFragment in its layout, and its own BottomNav
         This NavHost has navGraph of childfragment_navigation.xml: which, similar to MainActivity,
         handles the bottom navigation fragments for the child fragment etc. etc.
这带来了一些问题。首先,如果用户导航到此子片段,我必须显示并隐藏MainActivity BottomNavigationView,如下所示:

    private fun setupNavController() {
        val navController = findNavController(R.id.nav_host_fragment)
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_groups, R.id.navigation_courses, R.id.navigation_profile
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        nav_view.setupWithNavController(navController)
        navController.addOnDestinationChangedListener { _, destination, _ ->
            when (destination.id) {
                R.id.navigation_groups, R.id.navigation_courses, R.id.navigation_profile -> showBottomNavigation()
                else -> hideBottomNavigation()
            }
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.nav_host_fragment).navigateUp() || super.onSupportNavigateUp()
    }

    private fun hideBottomNavigation() {
        nav_view.visibility = View.GONE
    }

    private fun showBottomNavigation() {
        nav_view.visibility = View.VISIBLE
    }
这感觉真的很笨拙,有点像黑客,还开始在MainActivity中添加一些不需要的视图逻辑

第二个问题是关于appbar和Backback的东西。一旦我进入子片段,我会得到该子片段的更新工具栏标题,但是任何进一步的操作栏更新都不会在初始阶段起作用,如果我深入到更多的子片段中,按back一开始除了将我带回MainActivity之外不会起作用。向两个NavHostFragments添加
app:defaultNavHost=“true”
似乎可以解决一些问题,即在子片段中,后退按钮一次正常工作,尽管app bar up按钮不适用于子片段的子片段,但它总是返回到MainActivity

我试着把这个放在子片段中:

NavigationUI.setupActionBarWithNavController(activity as AppCompatActivity, navController)
这会更新工具栏标题,但“向上”按钮仍会返回主活动

对于这个应用程序结构,我可以想到3种可能的解决方案(子片段有自己的底部导航):

  • 放弃单一活动架构,让子片段实际上是它自己的活动
  • 只需使用一个nav_图、一个NavHostFragment和一个BottomNav,然后找出一种交换的方法 底部导航菜单在儿童中出现一次-如有任何相关指导,将不胜感激
  • 坚持使用具有自己的NavHostFragment和BottomNav的子片段,并找出处理后堆栈、应用程序栏和显示/隐藏底部Nav的方法

  • 您可以遵循Google单一活动架构模式,但单个navHostFragment和单个navGraph无法保存您,您需要使用多个navHost每个都有自己的navGraph,因此,每个都有自己的导航。您需要在多个navHostFragment之间切换,每个都有自己的导航,这样它就可以轻松地工作


    您可以从中获得帮助[

    我正在尝试使用此方法,但我找不到从一个图形导航到另一个图形中的目标的方法。示例:-BottomNavigationView中有两个选项(主页和帐户)-主页显示我的收藏夹帐户和帐户列表我的所有帐户-如果单击帐户中的一个帐户,将打开我的帐户详细信息如何单击主页中的一个帐户(收藏夹帐户)并直接转到帐户详细信息?您可以使用实现此功能。通过使用嵌套的导航图,您可以从您的帐户启动整个帐户流“主页”部分,如果您只需要“主页”中的“帐户详细信息”,则需要从主页导航图中指定您的“操作详细信息”。有关更多导航相关信息,请查看