5

我知道我可以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>

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


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

setTitle("Recycler bin");
toolbar.setBackgroundColor(Color.BLUE);
getWindow().setStatusBarColor(Color.parseColor("#5694FF"));

它看起来如下

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);
    }
}

当导航抽屉滑出时,提供透明度属性无济于事。

4

3 回答 3

6

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

您的代码的等价物如下:


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

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

在此处输入图像描述

于 2018-05-08T19:21:51.013 回答
0

我猜您的透明度问题与您使用的方法无关,而与颜色本身有关!你正在使用这个getWindow().setStatusBarColor(Color.parseColor("#5694FF"));

尝试使用 RGBA 而不是 RGB,使其透明,应该是这样的:

getWindow().setStatusBarColor(Color.parseColor("#5694FF80"));

于 2018-05-08T15:58:15.897 回答
0
private void changeStatusBarColor(String 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.parseColor(color));
    }
}

如果您在该行代码之前在堆栈溢出中检查每个人,则将状态栏的透明度设置为实心

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
于 2018-05-08T17:52:46.043 回答