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

使用ViewCompat.setOnApplyWindowInsetsListener导致系统导航栏背景异常变色

问题原因

你直接给window.decorView设置OnApplyWindowInsetsListener会覆盖系统原本为DecorView预设的Insets处理逻辑:

  • 系统默认的DecorView逻辑会自动处理状态栏、导航栏的边距适配、颜色渲染逻辑,你替换了原有Listener后,这部分逻辑就失效了
  • 如果你返回WindowInsetsCompat.CONSUMED会直接消费所有Insets,后续所有View都拿不到Insets信息,系统自然无法正常渲染导航栏
  • 就算你直接返回原始Insets,也没有触发DecorView原本的适配逻辑,同样会导致导航栏显示异常

解决方法

处理完你的自定义逻辑后,主动调用DecorView原有的Insets处理方法即可,完全不会影响原有界面效果,同时能正常检测软键盘状态:

ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { view, insets ->
    // 你的业务逻辑:检测软键盘可见性
    binding.showingKeyboard = insets.isVisible(WindowInsetsCompat.Type.ime())
    // 核心:调用系统原有处理逻辑,返回处理后的Insets
    ViewCompat.onApplyWindowInsets(view, insets)
}

如果你不想修改DecorView的原有Listener,还有更稳妥的替代方案:直接给你的布局根View设置Listener,效果完全一致,不会影响系统逻辑:

ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
    binding.showingKeyboard = insets.isVisible(WindowInsetsCompat.Type.ime())
    // 直接返回原始Insets让下层View正常处理即可
    insets
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:36:03