一、背景
项目中需要实现背景图从状态栏开始显示(即沉浸式状态栏),同时保持状态栏图标(如电量、时间等)可见
二、方案实现
方案一:在Activity中设置
1、首先将styles文件的AppTheme改为无标题栏 即:
XML
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
2、设置沉浸式状态栏(Activity中设置方案)
Kotlin
/**
* 设置沉浸式状态栏
*/
private fun setupImmersiveStatusBar() {
// API 21+ 设置状态栏透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.statusBarColor = Color.TRANSPARENT
}
// API 23+ 设置状态栏图标颜色(亮色或暗色)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 亮色背景使用暗色图标
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
// 或者使用暗色背景使用亮色图标
// window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
// View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
// View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
}
注:在Activity的setContentView前调用
方案二:在主题中设置(values/themes.xml)
XML
<style name="Theme.App.Immersion" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- 设置状态栏透明 -->
<item name="android:statusBarColor">@android:color/transparent</item>
<!-- 确保内容可以延伸到状态栏 -->
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>