You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:42:04