带有导航抽屉和操作栏向上导航的Android导航组件不同步

时间:2018-12-21 14:34:33

标签: android android-fragments navigation-drawer android-architecture-components

我一直在使用新的导航架构组件和导航抽屉来构建示例应用程序。

我创建了我的导航图,创建了我的片段,并且导航抽屉显示和在片段之间进行导航(主要是按预期进行)。问题在于,每次我从导航抽屉中选择一项时,都会将片段添加到堆栈中,而不是弹出现有片段并添加新片段。这意味着,如果我导航到一个新片段,那么我已经创建了一个后退堆栈,点击操作栏中的菜单按钮会从堆栈中弹出最新片段,而不是像我期望的那样打开导航抽屉。这是我的代码:

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 :(得分:0)

我发现有两个要求才能使导航抽屉,导航图和操作栏与我期望的行为完全同步。

第一个是AppBarConfiguration。我必须创建一个应用栏配置,其中包含一组顶级目标(导航抽屉中的顶级片段)。

第二个方面是确保在onSupportNavigateUp()函数中将应用程序栏配置包含在调用中,例如:`navController.navigateUp(appBarConfiguration)。

完成这两项操作后,一切都会按预期进行,导航抽屉,操作栏和向上按钮都可以同步工作,而不必向堆栈中添加片段。