我一直在使用新的导航架构组件和导航抽屉来构建示例应用程序。
我创建了我的导航图,创建了我的片段,并且导航抽屉显示和在片段之间进行导航(主要是按预期进行)。问题在于,每次我从导航抽屉中选择一项时,都会将片段添加到堆栈中,而不是弹出现有片段并添加新片段。这意味着,如果我导航到一个新片段,那么我已经创建了一个后退堆栈,点击操作栏中的菜单按钮会从堆栈中弹出最新片段,而不是像我期望的那样打开导航抽屉。这是我的代码:
private fun configureNavigation() {
navDrawerLayout = findViewById(R.id.navigation_drawer_layout)
navView = findViewById(R.id.navigationView)
navController = Navigation.findNavController(this, R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
setOf(R.id.workouts_fragment, R.id.create_workout_fragment, R.id.workout_history_fragment),
navDrawerLayout
)
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)
NavigationUI.setupWithNavController(navView, navController)
navView.setNavigationItemSelectedListener(this)
}
override fun onSupportNavigateUp() = navController.navigateUp()
override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
menuItem.isChecked = true
navDrawerLayout.closeDrawers()
@IdRes val destination: Int = when (menuItem.itemId) {
R.id.workouts_nav_drawer_item -> R.id.workouts_fragment
R.id.create_workout_nav_drawer_item -> R.id.create_workout_fragment
R.id.workout_history_nav_drawer_item -> R.id.workout_history_fragment
else -> {
throw IllegalArgumentException("Attempting to process an unrecognized menuItem id in the navigation drawer layout")
}
}
if (destination != currentDestination) {
currentDestination = destination
navController.navigate(destination)
}
return true
}
答案 0 :(得分:0)
我发现有两个要求才能使导航抽屉,导航图和操作栏与我期望的行为完全同步。
第一个是AppBarConfiguration
。我必须创建一个应用栏配置,其中包含一组顶级目标(导航抽屉中的顶级片段)。
第二个方面是确保在onSupportNavigateUp()
函数中将应用程序栏配置包含在调用中,例如:`navController.navigateUp(appBarConfiguration)。
完成这两项操作后,一切都会按预期进行,导航抽屉,操作栏和向上按钮都可以同步工作,而不必向堆栈中添加片段。