Я создавал образец приложения с новым компонентом архитектуры навигации в сочетании с навигационным ящиком.
У меня создан навигационный граф, созданы мои фрагменты, а панель навигации отображает и перемещается между фрагментами в основном так, как ожидалось. Проблема в том, что каждый раз, когда я выбираю элемент из навигационного ящика, он добавляет фрагмент в стек вместо того, чтобы выталкивать существующий и добавлять новый. Это означает, что если я перейду к новому фрагменту, я создал задний стек и нажатие кнопки меню на панели действий выталкивает последний фрагмент из стека, вместо того, чтобы открывать панель навигации, как я ожидал. Вот мой код:
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
}
Я обнаружил, что есть два требования, чтобы полностью синхронизировать навигационный ящик, навигационный график и панель действий с моим желаемым поведением.
Первый - это AppBarConfiguration. Мне пришлось создать конфигурацию панели приложения, содержащую набор пунктов назначения верхнего уровня (фрагменты верхнего уровня в навигационном ящике).
Второй аспект заключался в том, чтобы в функции onSupportNavigateUp() включить конфигурацию панели приложений в вызов как таковую: `navController.navigateUp (appBarConfiguration).
Как только я сделал эти две вещи, все заработало, как ожидалось, и панель навигации, панель действий и кнопка вверх работали синхронно, без ненужного добавления фрагментов в стек.