如何将已设为透明的状态栏和导航栏恢复为纯色?
解决设置FLAG_LAYOUT_NO_LIMITS后无法恢复状态栏纯色的问题
问题出在你没有清除之前设置的FLAG_LAYOUT_NO_LIMITS标记。这个标记会让窗口布局不受系统状态栏和导航栏的限制,布局直接延伸到系统栏区域,此时你设置的statusBarColor会被覆盖,导致状态栏看起来还是透明的。
修正后的代码需要先清除这个标记,再设置颜色和UI可见性:
// 清除FLAG_LAYOUT_NO_LIMITS标记,恢复系统栏的布局限制 window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) // 设置状态栏和导航栏为白色 window.statusBarColor = ContextCompat.getColor(this, R.color.white) window.navigationBarColor = ContextCompat.getColor(this, R.color.white) // 设置浅色状态栏/导航栏文字(适配Android 10及以下) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
如果你的应用需要适配Android 11(API 30)及以上版本,SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR已经被废弃,建议改用WindowInsetsController的API:
// 清除FLAG_LAYOUT_NO_LIMITS标记 window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) // 设置状态栏和导航栏颜色 window.statusBarColor = ContextCompat.getColor(this, R.color.white) window.navigationBarColor = ContextCompat.getColor(this, R.color.white) // 适配Android 11+的浅色系统栏文字设置 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val insetsController = window.insetsController insetsController?.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS or WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS or WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS ) } else { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR }
这样操作后,状态栏和导航栏就能正常显示为白色了。
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

