透明状态栏(带可见导航栏)

dor*_*506 5 android statusbar

我知道这个问题已经被问过很多次了,但所有的答案要么不起作用,要么使用了不推荐使用的代码:

我想达到与最新的谷歌地图应用程序相同的效果:

在此处输入图片说明

  • 完全透明的状态栏(只有状态栏。不是导航栏!)
  • 未弃用的解决方案

WindowCompat.setDecorFitsSystemWindows(window, false) 部分工作,因为它还隐藏了导航栏

Lal*_*dar 9

为了让画面StatusBar完全透明,

首先,在主题中将其颜色设置为透明或通过代码设置为:

//In Theme
<item name="android:statusBarColor">@android:color/transparent</item>
//In Code
window.statusBarColor = android.R.color.transparent
Run Code Online (Sandbox Code Playgroud)

然后,要绘制 后面的视图StatusBar,请使用以下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    window.setDecorFitsSystemWindows(false)
} else {
    window.setFlags(
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
    )
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用该boolean属性android:windowLightStatusBar,它将文本和图标颜色设置StatusBar为黑色或白色,您也可以通过编程来完成。NavigationBar如果您不想隐藏它,也可以为其设置颜色。

输出:

在此输入图像描述


Zai*_*ain 6

第 1 步:要使状态栏透明:将以下内容添加到样式中themes.xmlsytles.xml

<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>

<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
Run Code Online (Sandbox Code Playgroud)

步骤2:然后在活动中使状态栏与活动重叠:

从 API 级别 30 起不推荐使用使用的窗口标志,因此它们可以使用到 API 级别 29:

if (Build.VERSION.SDK_INT in 21..29) { 
    window.statusBarColor = Color.TRANSPARENT
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.decorView.systemUiVisibility =
        SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or SYSTEM_UI_FLAG_LAYOUT_STABLE

} else if (Build.VERSION.SDK_INT >= 30) {
    window.statusBarColor = Color.TRANSPARENT
    // Making status bar overlaps with the activity
    WindowCompat.setDecorFitsSystemWindows(window, false)
}
Run Code Online (Sandbox Code Playgroud)

这在 API 级别 19 到 API 级别 30 的范围内在 8 个设备/模拟器上进行了测试。