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

Drawer Navigation View中Switch按钮切换动画失效问题求助

问题根因

当你调用navigation_view.menu.findItem(R.id.nav_home).isEnabled修改菜单项启用状态时,NavigationView会触发全局菜单重绘流程,所有菜单项的视图(包括你添加的SwitchCompat)都会被强制刷新到最终状态,此时Switch正在执行的切换动画会被直接打断,因此看不到过渡效果。

修复方案

把修改菜单项状态的逻辑延迟到Switch切换动画完成之后执行,避免动画被重绘打断即可,两种常用实现方式如下:

方案1:固定延迟适配动画时长

SwitchCompat默认切换动画时长为200ms,直接写死延迟时间即可满足绝大多数场景:

// 建议替换setOnClickListener为OnCheckedChangeListener,覆盖所有开关状态变更场景
switch_id.setOnCheckedChangeListener { _, isChecked ->
    switch_id.postDelayed({
        navigation_view.menu.findItem(R.id.nav_home).isEnabled = isChecked
    }, 200)
}

方案2:监听动画完成回调

如果不想写死延迟时间,可以监听Switch动画执行进度,动画跑完后再修改菜单状态:

switch_id.setOnCheckedChangeListener { _, isChecked ->
    switch_id.animate().setUpdateListener { animation ->
        if (animation.animatedFraction == 1f) {
            navigation_view.menu.findItem(R.id.nav_home).isEnabled = isChecked
            // 用完清空回调避免内存泄漏
            switch_id.animate().setUpdateListener(null)
        }
    }
}

内容的提问来源于stack exchange,提问作者Tomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:42:01