Як змінити колір рядка стану, щоб відповідати додатку в Lollipop? [Android]


96

У новому оновлення льодяника я помітив, що за допомогою власних програм Google колір рядка стану змінюється, щоб він відповідав рядку дій у програмі, яку ви працюєте. Я бачу, що це також у додатку Twitter, тому я здогадуюсь, що це не виключно Google.

Хтось знає, як це зробити, якщо це можливо?

Відповіді:


221

Для зміни кольору рядка стану використовуйте setStatusBarColor (колір int) . За словами 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

3
@Azad Ні, це не означає. Для використання вищевказаного фрагмента коду необхідно переконатися, що ваш пристрій працює на API 21 або новішої версії.
клімат

1
Я працюю над відносно простим проектом, і мушу сказати, що я просто використовував, getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));і він працював ідеально. Не впевнений у контексті, в якому прапори вкрай необхідні.
Хоакін Юрчук

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 Studio створює такі записи для кожного проекту: <color name="colorPrimary">#somecolor</color>і <color name="colorPrimaryDark">#somecolor</color>. Їх можна змінити для досягнення бажаного ефекту.
Нейромедіатор

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 замість матеріалу.
Мартін

3
@Martin Для appcompat використовуйте colorPrimaryDark без префікса Android.
Міхель

також не працює для appcompat (перевірено на рівні 18)
Мохаммед Зекралла

Колір рядка стану працюватиме лише на пристроях з ОС API рівня 21 і вище. Також у своєму маніфесті переконайтеся, що ви не змінюєте цей стиль в окремих видах діяльності.
Левон

для inappbrowser як змінити колір панелі пошуку таким же, як і колір програми
R.Anandan

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>

Потім визначте білі | темні теми 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. Якщо ви використовуєте андроїд-студію, просто додайте lib Systembartint у файл 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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.