Android/Kotlin:不使用抽屉导航切换Fragment的正确方式
问题场景
基于Android Studio抽屉布局模板开发,已在navGraph中添加多个Fragment,侧边抽屉可正常访问。在作为导航起始目标(app:startDestination="@+id/nav_home")的HomeFragment中添加按钮,通过以下代码直接跳转到Fragment2:
binding.calculatorButton.setOnClickListener { val navHostFragment = activity?.supportFragmentManager?.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment val navController = navHostFragment.navController navController.navigate(com.example.doughhero.R.id.nav_fragment2) }
出现异常:点击抽屉中的Home选项,会跳转到Fragment2且Fragment2在抽屉菜单中高亮,但点击返回箭头可正常回到HomeFragment。
问题原因
问题根源在AppBarConfiguration的配置逻辑:
原错误代码手动指定了多个Fragment ID作为顶级目标:
appBarConfiguration = AppBarConfiguration(setOf(R.id.nav_home,R.id.nav_fragment2,R.id.nav_fragment3, R.id.nav_fragment4), drawerLayout)
当从HomeFragment跳转到Fragment2后,导航栈为HomeFragment -> Fragment2。此时点击抽屉的Home选项,Navigation组件会尝试将栈pop到配置的顶级目标之一。由于Fragment2被设为顶级目标,组件判定当前已处于“顶级”页面,不会回到HomeFragment,反而错误维持在Fragment2并高亮对应抽屉项。
解决方案
将AppBarConfiguration改为传入整个导航图,让组件自动识别导航图中的所有根节点Fragment作为顶级目标:
appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
修改后,点击抽屉的Home选项时,Navigation组件会正确将导航栈pop回到起始目标nav_home,抽屉菜单的高亮也会与当前页面匹配。
内容的提问来源于stack exchange,提问作者jaywalker
相关产品推荐
相关产品推荐

