使用setOnApplyWindowInsetsListener后状态栏颜色消失如何解决?
问题原因
- 调用
ViewCompat.setOnApplyWindowInsetsListener会直接替换目标View原有的窗口边距回调处理逻辑,原有逻辑默认包含状态栏颜色适配、系统边距适配的相关处理步骤 - 你当前的实现仅完成了软键盘可见性判断,直接返回原始
windowInsets对象,没有触发View原有的insets处理流程,导致原本的状态栏着色逻辑未执行,状态栏颜色就会恢复为默认值,看起来像是消失了。
修复方案
将代码中的返回值替换为ViewCompat.onApplyWindowInsets(view, windowInsets),触发View原有处理逻辑即可,修改后的代码如下:
fun isKeyboardVisible(view: View) { ViewCompat.setOnApplyWindowInsetsListener(view) { view, windowInsets -> val isKeyboardVisible = windowInsets.isVisible(WindowInsetsCompat.Type.ime()) if (isKeyboardVisible) Toast.makeText(applicationContext, "opened", Toast.LENGTH_SHORT).show() else Toast.makeText(applicationContext, "closed", Toast.LENGTH_SHORT).show() // 执行View默认的insets处理逻辑,保留原有状态栏、导航栏适配效果 ViewCompat.onApplyWindowInsets(view, windowInsets) } }
如果你使用的androidx core版本在1.5.0及以上,也可以改用ViewCompat.addOnApplyWindowInsetsListener,它不会覆盖View原有的监听逻辑,仅追加你的自定义处理,也能避免该问题。
内容的提问来源于stack exchange,提问作者pat20036
相关产品推荐
相关产品推荐

