Динамическая настройка цвета строки состояния в Android не работает

Я разрабатываю приложение для Android. В моем приложении я устанавливаю цвет панели действий в соответствии с цветовым кодом, поступающим с сервера. Настройка цвета фона в порядке и работает. Но я также хочу изменить цвет строки состояния в соответствии с цветовым кодом панели действий. Я хочу затемнить цвет и установить его в строке состояния, как показано ниже.

введите здесь описание изображения

Я установил цвет строки состояния, подобный этому, в действии

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

Вот что я получаю:

введите здесь описание изображения

Как видите, цвет строки состояния не меняется. Как я могу изменить цвет строки состояния, затемнив цвет панели действий?


person Wai Yan Hein    schedule 16.10.2016    source источник
comment
Вы пытаетесь установить для StatusBar тот же цвет, что и для ActionBar? Если да, вы можете это сделать. Отметьте material.google.com/style/color.html#color-color. -palette , ActionBar задает 500 и StatusBar задает 700 цветов.   -  person M. Wiśnicki    schedule 16.10.2016
comment
Нет. Затемнить цвет панели действий. Затем установите в строке состояния.   -  person Wai Yan Hein    schedule 16.10.2016
comment
Мой цветовой код динамический. Приходит с сервера.   -  person Wai Yan Hein    schedule 16.10.2016


Ответы (2)


Я также пытался добиться того же эффекта, динамически генерировать темный цвет для строки состояния, поэтому, пожалуйста, посмотрите, как я это сделал.

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));
}
person Alex Kamenkov    schedule 16.10.2016
comment
Я только что получил тот же результат. - person Wai Yan Hein; 17.10.2016
comment
У вас версия Android Lollipop или выше? - person Alex Kamenkov; 17.10.2016
comment
Да. Я тестирую на реальном устройстве с версией 6+ - person Wai Yan Hein; 17.10.2016

используйте этот код для изменения цвета строки состояния (темнее, чем цвет панели инструментов)

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

`

person Vaishali Malviya    schedule 22.07.2017