动态更改状态栏颜色而不会失去透明度

Che*_*eng 5 android android-layout android-view drawerlayout windowinsets

我知道我可以colorPrimary用来确定颜色Toolbar,并colorPrimaryDark确定状态栏的颜色.

我正在使用以下主题

<!-- Base application theme. -->
<style name="Theme.Noteplus.Base.Brown" parent="Theme.AppCompat.Light.DarkActionBar">

    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimaryLight</item>
    <item name="colorPrimaryDark">#ff0000</item>

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
Run Code Online (Sandbox Code Playgroud)

其中一个有趣的属性是,当我滑出导航菜单时,状态栏会自动变为透明状态.


在运行期间,有时我想更改状态栏的颜色.

setTitle("Recycler bin");
toolbar.setBackgroundColor(Color.BLUE);
getWindow().setStatusBarColor(Color.parseColor("#5694FF"));
Run Code Online (Sandbox Code Playgroud)

它看起来如下

不幸的是,setStatusBarColor当我们滑出导航菜单时,调用也会丢失状态栏的透明度属性.

我可以知道,如何在运行时更改状态栏颜色,而不会损失其透明属性?对于我的情况,在运行期间将状态栏更改为蓝色后,当我滑出导航抽屉时,我希望看到状态栏透明度属性被保留.


更新

我试过了

private void setStatusBarColor(int color) {
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(color);
    }
}
Run Code Online (Sandbox Code Playgroud)

导航抽屉滑出时,提供透明属性无效.

azi*_*ian 6

您正在使用DrawerLayout。这意味着,Window#setStatusBarColor(int)应该使用DrawerLayout#setStatusBarBackground()过载之一而不是使用过载。

等效的代码如下:


    ColorDrawable colorDrawable = new ColorDrawable(0xFF5694FF);
    drawerLayout.setStatusBarBackground(colorDrawable);

我已对可以通过Android Studio向导创建的模板应用程序进行了较小的更改:

在此处输入图片说明