Компонент навигации Android с навигационным блоком и навигационной панелью вверх Навигация не синхронизирована - PullRequest
0 голосов
/ 21 декабря 2018

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

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

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 голосов
/ 21 декабря 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...