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

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

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


person Cheok Yan Cheng    schedule 06.05.2018    source источник
comment
ты пробовал это? Панель действий = getActionBar(); bar.setBackgroundDrawable(новый ColorDrawable(Color.parseColor(#004D40)));   -  person Yamen Nassif    schedule 08.05.2018
comment
Мы уже сделали getWindow().setStatusBarColor(Color.parseColor("#5694FF"));, как указано в моем вопросе.   -  person Cheok Yan Cheng    schedule 08.05.2018
comment
Да, это setBackgroundDrawable, а не setColor   -  person Yamen Nassif    schedule 08.05.2018
comment
В нашем приложении нет ActionBar. Мы используем Toolbar. getActionbar() вернет ноль.   -  person Cheok Yan Cheng    schedule 08.05.2018
comment
плохо, я перепутал панель действий со строкой состояния, я добавил ответ, хотя сейчас у меня нет AndroidStudio для тестирования, но я думаю, что это поможет   -  person Yamen Nassif    schedule 08.05.2018
comment
пожалуйста, проверьте stackoverflow.com/a/28594509/3283568   -  person Akshay    schedule 08.05.2018


Ответы (3)


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

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


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

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

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

person azizbekian    schedule 08.05.2018

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

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

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

person Yamen Nassif    schedule 08.05.2018
comment
Это не поможет. i.imgur.com/9lmRAkg.png (мы используем #7f757575). Мы можем использовать цвет без прозрачности в colorPrimaryDark (то есть #ff0000), но сохраняем атрибут прозрачности строки состояния. - person Cheok Yan Cheng; 08.05.2018
comment
скажите, изменит ли это что-нибудь: Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); и используйте его после смены цвета - person Yamen Nassif; 08.05.2018
comment
в случае, если это сработало (вообще удалена строка состояния), вы можете обратиться к этому, чтобы найти правильные флаги, которые вам нужны, чтобы сделать его прозрачным, или как Android любит называть его ПРОЗРАЧНЫМ: developer.android.com/reference/android/view/ - person Yamen Nassif; 08.05.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)
person MrMins    schedule 08.05.2018