如何使用Android导航组件处理嵌套的BottomNavigationView?
我正在使用Android导航组件(目前为v2.1.0),并且我正在尝试解决如何最好地处理需要自己的BottomNavigationView的子屏幕,MainActivity已经有了顶级的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
- 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种可能的解决方案(子片段有自己的底部导航):
您可以遵循Google单一活动架构模式,但单个navHostFragment和单个navGraph无法保存您,您需要使用多个navHost每个都有自己的navGraph,因此,每个都有自己的导航。您需要在多个navHostFragment之间切换,每个都有自己的导航,这样它就可以轻松地工作
您可以从中获得帮助[我正在尝试使用此方法,但我找不到从一个图形导航到另一个图形中的目标的方法。示例:-BottomNavigationView中有两个选项(主页和帐户)-主页显示我的收藏夹帐户和帐户列表我的所有帐户-如果单击帐户中的一个帐户,将打开我的帐户详细信息如何单击主页中的一个帐户(收藏夹帐户)并直接转到帐户详细信息?您可以使用实现此功能。通过使用嵌套的导航图,您可以从您的帐户启动整个帐户流“主页”部分,如果您只需要“主页”中的“帐户详细信息”,则需要从主页导航图中指定您的“操作详细信息”。有关更多导航相关信息,请查看