Динамическое изменение цвета строки состояния без потери прозрачности - PullRequest
0 голосов
/ 06 мая 2018

Я знаю, что могу использовать 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>

image

Одним из интересных атрибутов является то, что, когда я выдвигаю меню навигации, строка состояния автоматически становится прозрачной.

image


Во время выполнения иногда я хотел бы изменить цвет строки состояния.

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

Это будет выглядеть следующим образом

image

К сожалению, вызов setStatusBarColor также приведет к потере атрибута прозрачности строки состояния, когда мы выскользнем из меню навигации.

image

Могу ли я узнать, как изменить цвет строки состояния во время выполнения, не теряя атрибут прозрачности? В моем случае, после изменения строки состояния на синий во время выполнения, когда я выдвигаю панель навигации, я хочу, чтобы атрибут прозрачности строки состояния сохранялся.


Обновление

Я пытался

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

Не помогает предоставить атрибут прозрачности, когда ящик навигации выдвигается.

image

Ответы [ 3 ]

0 голосов
/ 08 мая 2018
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)
0 голосов
/ 08 мая 2018

Вы используете DrawerLayout. Это означает, что вместо использования Window#setStatusBarColor(int) вы должны использовать одну из DrawerLayout#setStatusBarBackground() перегрузок.

Эквивалент вашего кода следующий:


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

Я применил незначительные изменения в шаблонном приложении, которое можно создать с помощью мастера Android Studio:

enter image description here

0 голосов
/ 08 мая 2018

Я полагаю, что ваша проблема с прозрачностью связана не с методом, который вы используете, а с самим цветом! Вы используете это getWindow().setStatusBarColor(Color.parseColor("#5694FF"));

Попробуйте использовать RGBA вместо RGB, поэтому сделайте его прозрачным, должно быть что-то вроде этого:

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

...