【问题标题】:Dynamically setting the status bar color in Android is not working在Android中动态设置状态栏颜色不起作用
【发布时间】:2016-10-16 12:23:51
【问题描述】:

我正在开发一个 Android 应用程序。在我的应用程序中,我根据来自服务器的颜色代码设置操作栏颜色。设置背景颜色很好并且可以工作。但我也想根据动作栏的颜色代码来改变状态栏的颜色。我想加深颜色并将其设置在状态栏上,如下图所示。

我在activity中这样设置状态栏颜色

private void setStatusBarColor()
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();

            // clear FLAG_TRANSLUCENT_STATUS flag:
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

            // finally change the color
             window.setStatusBarColor(getResources().getColor(R.color.statusBarColor));
        }
    }

但这次我需要动态更改颜色。我用模拟颜色值测试了但没有工作。

在活动的onCreate方法中

       teamColorCode = "#EB6343";
        if(teamColorCode!=null && !teamColorCode.isEmpty())
        {
            int color = Color.parseColor(teamColorCode);
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color));
            //set for action bar
            float[] hsv = new float[3];
            Color.colorToHSV(color,hsv);
            hsv[2] *= 0.8f; // value component
            color = Color.HSVToColor(hsv);
            setStatusBarColor(color);
        }

如您所见,我为 teamColorCode 变量分配了一个颜色代码值。然后我尝试使该颜色变暗并设置状态栏的颜色。这就是我设置状态栏颜色的方式。

 private void setStatusBarColor(int color)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();

            // clear FLAG_TRANSLUCENT_STATUS flag:
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

            // finally change the color
            if(color>0)
            {
                window.setStatusBarColor(color);
            }
            else{
                window.setStatusBarColor(getResources().getColor(R.color.statusBarColor));
            }
        }
    }

这是我得到的:

如您所见,状态栏颜色没有变化。如何更改状态栏颜色使操作栏颜色变暗?

【问题讨论】:

  • 您是否尝试为 StatusBar 设置与 ActionBar 相同的颜色?如果是的话,你可以这样做。检查material.google.com/style/color.html#color-color-palette,ActionBar 设置 500 和 StatusBar 设置 700 颜色。
  • 没有。加深操作栏的颜色。然后设置为状态栏。
  • 我的颜色代码是动态的。来自服务器。

标签: android android-actionbar statusbar android-statusbar


【解决方案1】:

我也尝试过实现同样的效果,动态为状态栏生成深色,请看看我是怎么做到的。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = this.getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    window.setStatusBarColor(getDarkColor(Color.GREEN, 0.7));
}

深色生成方法(值越小,得到的颜色越深)。

public int getDarkColor(int color, double value) {
    int r = Color.red(color);
    int g = Color.green(color);
    int b = Color.blue(color);
    return Color.rgb((int) (r * value), (int) (g * value), (int) (b * value));
}

【讨论】:

  • 我得到了同样的结果。
  • 您的 Android 版本是 Lollipop 还是更高版本?
  • 是的。我正在使用版本 6+ 的真实设备进行测试
【解决方案2】:

使用此代码更改状态栏颜色(比工具栏颜色更深)

   factor=0.8f; 
    int a = Color.alpha(toolbarcolor);
    int r = Math.round(Color.red(toolbarcolor) * factor);
    int g = Math.round(Color.green(toolbarcolor) * factor);
    int b = Math.round(Color.blue(toolbarcolor) * factor);
    int statusColor=Color.argb(a,
            Math.min(r, 255),
            Math.min(g, 255),
            Math.min(b, 255));

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = MainActivity.this.getWindow();
        window.setStatusBarColor(statusColor);
    }

`

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多