为什么View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION会影响状态栏,如何仅作用于导航栏
问题原因
你使用的View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION标记本身的特性是让Window根布局忽略系统栏(包含状态栏、导航栏)的padding限制,布局会直接延伸到两类系统栏的底层,所以才会连带影响状态栏的显示效果。
解决方案
方案1:仅修改导航栏颜色,不需要沉浸式效果
如果你不需要让页面内容延伸到导航栏下方,直接删除SystemUiVisibility相关配置即可,配置只会作用于导航栏,不会影响状态栏:
window.navigationBarColor = ContextCompat.getColor(this, R.color.blue_beautiful_color)
方案2:需要沉浸式导航栏,不影响状态栏
如果你确实需要让内容穿透到导航栏下方做沉浸式效果,补充标记明确限制布局不要延伸到状态栏区域,同时保留原有状态栏配置即可:
window.navigationBarColor = ContextCompat.getColor(this, R.color.blue_beautiful_color) // 仅允许布局延伸到导航栏下方,同时保持布局稳定不偏移 val option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE window.decorView.systemUiVisibility = option // 单独设置状态栏为原有颜色,避免被布局覆盖 window.statusBarColor = ContextCompat.getColor(this, R.color.你原先使用的状态栏颜色) // 可选:如果需要调整状态栏文字/图标深浅,可加下面的配置 // window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
高版本兼容方案(Android 10及以上)
如果你的应用兼容Android 10及以上系统,推荐使用官方推荐的InsetsController做更精准的控制,避免标记冲突:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.setDecorFitsSystemWindows(false) window.insetsController?.apply { systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } // 仅修改导航栏颜色 window.navigationBarColor = ContextCompat.getColor(this, R.color.blue_beautiful_color) // 保留状态栏原有配置 window.statusBarColor = ContextCompat.getColor(this, R.color.你原先使用的状态栏颜色) } else { // 低版本走方案2的兼容逻辑 val option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE window.decorView.systemUiVisibility = option window.navigationBarColor = ContextCompat.getColor(this, R.color.blue_beautiful_color) window.statusBarColor = ContextCompat.getColor(this, R.color.你原先使用的状态栏颜色) }
内容的提问来源于stack exchange,提问作者lqh
相关产品推荐
相关产品推荐

