Компонент Android Navigation с Nav Drawer и Action Bar Up Navigation не синхронизируется

Я создавал образец приложения с новым компонентом архитектуры навигации в сочетании с навигационным ящиком.

У меня создан навигационный граф, созданы мои фрагменты, а панель навигации отображает и перемещается между фрагментами в основном так, как ожидалось. Проблема в том, что каждый раз, когда я выбираю элемент из навигационного ящика, он добавляет фрагмент в стек вместо того, чтобы выталкивать существующий и добавлять новый. Это означает, что если я перейду к новому фрагменту, я создал задний стек и нажатие кнопки меню на панели действий выталкивает последний фрагмент из стека, вместо того, чтобы открывать панель навигации, как я ожидал. Вот мой код:

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
}
1
0
1 332
1

Ответы 1

Я обнаружил, что есть два требования, чтобы полностью синхронизировать навигационный ящик, навигационный график и панель действий с моим желаемым поведением.

Первый - это AppBarConfiguration. Мне пришлось создать конфигурацию панели приложения, содержащую набор пунктов назначения верхнего уровня (фрагменты верхнего уровня в навигационном ящике).

Второй аспект заключался в том, чтобы в функции onSupportNavigateUp() включить конфигурацию панели приложений в вызов как таковую: `navController.navigateUp (appBarConfiguration).

Как только я сделал эти две вещи, все заработало, как ожидалось, и панель навигации, панель действий и кнопка вверх работали синхронно, без ненужного добавления фрагментов в стек.

Другие вопросы по теме