Android设置onDrawerSlide后topLevelDestinationIds被忽略、抽屉每次弹出问题
问题根源
你手动创建并绑定到Toolbar的ActionBarDrawerToggle会接管Toolbar导航按钮的点击事件,优先级高于NavigationUI内部自动设置的导航逻辑,因此AppBarConfiguration配置的顶层目的地规则被覆盖:无论当前处于哪个Fragment,点击导航按钮都会触发抽屉弹出,也不会自动切换为返回图标。
解决方法
不需要自定义ActionBarDrawerToggle,删除你现有代码中自定义Toggle、绑定Toggle到Toolbar、调用syncState的相关代码即可。如果需要监听抽屉滑动事件,直接给DrawerLayout添加独立的DrawerListener即可,不会干扰原有导航逻辑。
修改后的参考代码如下:
val drawerLayout: DrawerLayout = binding.drawerLayout val navView: NavigationView = binding.navView val navController = findNavController(R.id.nav_host_fragment_content_main) // 仅添加独立的抽屉状态监听,不绑定到Toolbar drawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener { override fun onDrawerSlide(drawerView: View, slideOffset: Float) { // 此处写入你原本要在onDrawerSlide中执行的逻辑 } override fun onDrawerOpened(drawerView: View) {} override fun onDrawerClosed(drawerView: View) {} override fun onDrawerStateChanged(newState: Int) {} }) appBarConfiguration = AppBarConfiguration( setOf(R.id.nav_home), drawerLayout ) setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController)
setupActionBarWithNavController在传入携带DrawerLayout的AppBarConfiguration时,会自动创建适配导航逻辑的DrawerToggle,自动根据当前目的地是否为顶层,切换抽屉图标/返回图标,同时处理对应的点击逻辑。
内容的提问来源于stack exchange,提问作者Kenichi
相关产品推荐
相关产品推荐

