每个底部导航视图菜单项的单独导航图 - Android
Posted
技术标签:
【中文标题】每个底部导航视图菜单项的单独导航图 - Android【英文标题】:Individual Navigation graph for each Bottom navigation view menu item - Android 【发布时间】:2021-07-28 16:39:33 【问题描述】:我的应用程序包含一个底部导航视图,主活动中有 3 个菜单项,每个菜单项在导航容器视图中扩展各自的导航图。每个图都有 2 个或更多通过动作连接的片段。
这里的问题是在屏幕方向更改期间应用程序崩溃了。此外,底部导航不保留导航图的状态,也没有为底部导航维护回栈。
下面的代码示例。
val bottomNavigation = binding.bottom_navigation_view
navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
bottomNavigation.setOnNavigationItemSelectedListener item ->
when(item.itemId)
R.id.navigation_home ->
val navGraph = navController.navInflater.inflate(R.navigation.nav_graph)
navController.graph = navGraph
true
R.id.navigation_search ->
val searchGraph=navController.navInflater.inflate(R.navigation.search_nav_graph)
navController.graph = searchGraph
true
R.id.navigation_about ->
val infoGraph = navController.navInflater.inflate(R.navigation.info_nav_graph)
navController.graph = infoGraph
true
false
【问题讨论】:
【参考方案1】:创建NavigationExtension 类
以 FragmentContainerView 加载片段
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainer"
android:layout_
android:layout_
app:defaultNavHost="true" />
在 Activity 中设置 NavigationGraph
private fun setupBottomNavigationBar()
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)
val navGraphIds = listOf(R.navigation.nav_graph, R.navigation.search_nav_graph, R.navigation.info_nav_graph)
// Setup the bottom navigation view with a list of navigation graphs
val controller = bottomNavigation.setupWithNavController(
navGraphIds = navGraphIds,
fragmentManager = supportFragmentManager,
containerId = R.id.nav_host_container,
intent = intent
)
// Whenever the selected controller changes, setup the action bar.
controller.observe(this, Observer navController ->
setupActionBarWithNavController(navController)
)
currentNavController = controller
注意:底部导航项 id 和导航图 id 应该相同
更多细节可以参考这个示例project
【讨论】:
以上是关于每个底部导航视图菜单项的单独导航图 - Android的主要内容,如果未能解决你的问题,请参考以下文章