使用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
相关产品推荐
相关产品推荐

