Как изменить цвет строки состояния в соответствии с приложением в Lollipop? [Android]

96

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

Кто-нибудь знает, как это сделать, если можно?

Briscoooe
источник

Ответы:

221

Чтобы изменить цвет строки состояния, используйте setStatusBarColor (int color) . Согласно javadoc, нам также нужно установить некоторые флаги в окне.

Рабочий фрагмент кода:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(activity, R.color.example_color));


Имейте в виду, что в соответствии с рекомендациями по материальному дизайну цвет строки состояния и цвет панели действий должны отличаться:

  • ActionBar должен использовать основной цвет 500
  • StatusBar должен использовать основной цвет 700

Посмотрите на скриншот ниже:

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

климат
источник
4
Обратите внимание, что эффект может не отображаться в эмуляторе. Например, этот пример проекта окрашивает строку состояния на Nexus 9, но не на эмуляторе Android 5.0.
CommonsWare
1
@mate: Я имел в виду эмулятор Android SDK. Приятно знать, что он работает над Genymotion.
CommonsWare 01
3
@Azad Нет, не надо. Чтобы использовать приведенный выше фрагмент кода, вы должны убедиться, что ваше устройство работает на API 21 или выше.
klimat 08
1
Я работаю над относительно простым проектом, и должен сказать, что просто использовал, getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));и он отлично работал. Не уверен в контексте, в котором флаги строго необходимы.
Хоакин Юрчук 06
3
Я также хочу показать цвет в устройствах до леденца на палочке. Как это сделать?
WISHY
48

Просто добавьте это в свой файл styles.xml. ColorPrimary предназначен для панели действий, а colorPrimaryDark - для строки состояния.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
</style>

Это изображение от разработчика Android объясняет больше о цветовой палитре. Вы можете прочитать больше по этой ссылке .

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

Джоко Бозинов
источник
Android Studio создает следующие записи для каждого проекта: <color name="colorPrimary">#somecolor</color>и <color name="colorPrimaryDark">#somecolor</color>. Их можно менять для достижения желаемого эффекта.
Neurotransmitter
41

Другой способ установить цвет строки состояния - использовать файл style.xml .

Для этого создайте файл style.xml в папке res / values-v21 с таким содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material">
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="android:colorPrimaryDark">@color/blue_dark</item>
    </style>
</resources>

Изменить: как указано в комментариях, при использовании AppCompat код отличается. Вместо этого в файле res / values ​​/ style.xml используйте:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">   
    <!-- Set AppCompats color theming attrs -->
    <item name="colorPrimary">@color/my_awesome_red</item>
    <item name="colorPrimaryDark">@color/my_awesome_darker_red</item>
    <!-- Other attributes -->
</style>
Альберто Малаголи
источник
1
Сделал это. Но не вышло. Но тогда я использую AppCompat вместо Material.
Мартин
3
@Martin Для appcompat используйте colorPrimaryDark без префикса android.
Michiel
не работает и для appcompat (проверено на уровне 18)
Мохаммад Зекралла
Цвет строки состояния будет работать только на устройствах с OS API уровня 21 и выше. Также в манифесте убедитесь, что вы не отменяете этот стиль для отдельных действий.
Левон
для inappbrowser, как изменить цвет панели поиска так же, как цвет приложения
Р.Анандан
23

Чтобы установить цвет строки состояния, создайте файл style.xml в папке res / values-v21 со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppBaseTheme" parent="AppTheme">
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/blue</item>
    </style>

</resources>
Мухаммад Аамир Али
источник
в нем говорится, что не удается разрешить символ windowDrawsSystemBarBackgrounds
jmhostalet
4

Добавьте эту строку в стиле v21, если вы используете два стиля.

  <item name="android:statusBarColor">#43434f</item>
Амит Уолке
источник
Это не работает без установки флагаandroid:windowDrawsSystemBarBackgrounds
Славянин
4

Также, если вам нужен другой status-barцвет для разных действий ( фрагменты ), вы можете сделать это, выполнив следующие шаги (работайте с API 21 и выше):

Сначала создайте values21/style.xmlи поместите следующий код:

 <style name="AIO" parent="AIOBase">
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:windowContentTransitions">true</item>
    </style>

Затем определите темы White | Dark values/style.xmlследующим образом:

 <style name="AIOBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_primary_dark</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:textColorPrimary">@android:color/black</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@color/color_primary_dark
        </item>
        <item name="android:textColor">@color/gray_darkest</item>
        <item name="android:windowBackground">@color/default_bg</item>
        <item name="android:colorBackground">@color/default_bg</item>
    </style>


    <style name="AIO" parent="AIOBase" />

    <style name="AIO.Dark" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#171717
        </item>
    </style>

    <style name="AIO.White" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#bdbdbd
        </item>
    </style>

Также не забудьте применить темы в вашем manifest.xml.

Амир
источник
2

В устройствах Android pre Lollipop вы можете сделать это из SystemBarTintManager. Если вы используете студию Android, просто добавьте Systembartint lib в свой файл gradle.

dependencies {
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    ...
}

Тогда в вашей деятельности

// create manager instance after the content view is set
SystemBarTintManager mTintManager = new SystemBarTintManager(this);
// enable status bar tint
mTintManager.setStatusBarTintEnabled(true);
mTintManager.setTintColor(getResources().getColor(R.color.blue));
Мухаммад Аамир Али
источник