如何实现状态栏重叠UI,同时让导航栏不透明且不与UI重叠?
解决方案
要实现状态栏透明并与UI重叠,导航栏不透明且不与UI重叠的效果,需要针对不同Android版本做适配调整,以下是修改后的代码及说明:
fun setupStatusAndNavBar() { val window = window val decorView = window.decorView if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11及以上版本:用WindowInsetsController精确控制 val insetsController = WindowCompat.getInsetsController(window, decorView) // 配置状态栏:透明+允许UI重叠 window.statusBarColor = Color.TRANSPARENT WindowCompat.setDecorFitsSystemWindows(window, false) insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE // 配置导航栏:不透明+UI不重叠 window.navigationBarColor = resources.getColor(android.R.color.system_navigation_bar_background, theme) // 保留导航栏底部内边距,让UI自动避开导航栏区域 decorView.setOnApplyWindowInsetsListener { view, insets -> val adjustedInsets = insets.replaceSystemWindowInsets( insets.systemWindowInsetLeft, insets.systemWindowInsetTop, insets.systemWindowInsetRight, insets.systemWindowInsetBottom ) view.onApplyWindowInsets(adjustedInsets) adjustedInsets } } else { // Android 10及以下版本 // 配置状态栏:透明+允许UI重叠 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) // 配置导航栏:清除透明flag,设置不透明默认色 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) window.navigationBarColor = resources.getColor(android.R.color.system_navigation_bar_background, theme) // 确保布局延伸到状态栏,但不覆盖导航栏 window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN) window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) // Android 10单独处理:给布局添加底部margin避开导航栏 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) { decorView.setOnApplyWindowInsetsListener { view, insets -> val params = view.layoutParams as ViewGroup.MarginLayoutParams params.bottomMargin = insets.systemWindowInsetBottom view.layoutParams = params insets.consumeSystemWindowInsets() } } } }
关键调整说明
- 状态栏处理:
- 全版本设置状态栏为透明色,通过flag或WindowInsetsController允许UI延伸到状态栏下方,实现重叠效果。
- 导航栏处理:
- 清除导航栏透明相关的flag,设置默认不透明背景色。
- 通过
OnApplyWindowInsetsListener保留底部导航栏的内边距,让布局自动避开导航栏区域,避免重叠。
- 版本适配:
- Android 11+使用更灵活的
WindowInsetsController控制系统栏行为; - 低版本依赖WindowManager的flag和布局内边距调整。
- Android 11+使用更灵活的
额外注意
- 若布局根节点设置了
android:fitsSystemWindows="true",建议移除该属性,避免和代码中的设置冲突。 - 可替换
android.R.color.system_navigation_bar_background为自定义颜色值,调整导航栏外观。
内容的提问来源于stack exchange,提问作者ny_k
相关产品推荐
相关产品推荐

