在不影响导航栏的情况下使状态栏透明

Make status bar transparent without affecting navigation bar

我有这段代码可以使状态栏透明:

private void setTransparentStatusBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow();
            window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        }
}

但这也使导航栏透明,使我的视图占据了它下面的 space like this. 有什么办法可以只让状态栏透明吗?

从 styles.xml 您可以执行以下操作:

<style name="transparent" parent="Theme.AppCompat.Light">//AppCompat is the key; You can choose any other theme than the light-theme, but stick to AppCompat

    <item name="colorPrimaryDark">#00000000</item>//THIS is the important part.
    //Other styling(optional)
</style>

我所做的是将 colorPrimaryDark 设置为透明(这就是为什么有 8 位数字而不是 6 位数字的原因:前 2 位设置了透明度)。这会将状态栏的颜色设置为透明。

然后将其应用于您的布局,只需在根布局(视图)中添加以下行:

android:theme="@style/transparent"

将布局的主题设置为我上面显示的样式,将 colorPrimaryDark(状态栏的颜色)设置为透明。它仍然显示时间、通知等内容,但没有颜色。

现在,如果你想隐藏状态栏,你可以这样做:

    if (Build.VERSION.SDK_INT < 16) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    } 

请注意,以这种方式将其设置为全屏不会隐藏导航栏。要隐藏导航栏,您必须研究沉浸式全屏模式。

最后的注释

这最后的说明是为了确保我是安全的:

如果您所说的导航栏是指操作栏(屏幕顶部带有应用 name/other 文本的栏,在状态栏下方),则不受此影响。要影响操作栏,请更改 colorPrimary。

重要提示

即使你把bar设置为透明,如果下面没有任何渲染,它会显示主题的颜色(背景色)或黑色(因为那里没有任何东西,所以显示黑色)