Как изменить цвет строки состояния в Android?


427

Прежде всего, это не дубликат, как в разделе Как изменить цвет фона строки состояния Android.

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

Я хочу, чтобы цвет строки состояния был таким же, как цвет панели навигации

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


2
это возможно только после kitkat @MarkBuikema
— кодеркат

4
Как предполагает Нильс, существует ТЕМАТИЧЕСКИЙ АТРИБУТ, так как v21 вызывается android:statusBarColor. Вы можете просто добавить его в values-v21/styles.xml.
— Левите

@MarkBuikema Как это вообще относится к корневому доступу!
— Стив Моретц

Ответы:


626

В Android 5.0 Lollipop появилась тема Material Design, которая автоматически окрашивает строку состояния в зависимости от colorPrimaryDarkзначения темы.

Это поддерживается на устройстве перед леденцом на палочке благодаря библиотеке support-v7-appcompat начиная с версии 21. Блог-пост о поддержке appcompat v21 от Криса Бэйнса

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

Узнайте больше о Материальной теме на официальном сайте разработчиков Android.


29
по некоторым причинам атрибут colorPrimaryDark не работает для меня. примерил эмулятор v21
— девиантное

3
Это работает, вы должны увидеть изменения на эмуляторе, а не на предварительном просмотре макета [там его нет]
— Mightian

6
colorPrimaryDark не работает для меня также на эмуляторе API 18. Из статьи, связанной с appcompat: «На старых платформах AppCompat эмулирует цветовую тематику, где это возможно. На данный момент это ограничено окраской панели действий и некоторых виджетов».
— Адам Джонс

12
Как насчет изменения цвета шрифта в строке состояния? Документы ничего не говорят об этом.
— Скотт Биггс

Я пробовал так же. он отлично работает в большинстве устройств, но у меня Samsung Galaxy S4 под управлением ОС 5.0.1, и в этой строке состояния телефона цвет черный. И как только я перехожу к другому занятию и снова возвращаюсь к предыдущему занятию, цвет строки состояния меняется на цвет темы приложения. Любая причина, почему это происходит
— Hitesh Kamani

364

Обновить:

Леденец:

public abstract void setStatusBarColor (int color)

Добавлено в API уровень 21

Android Lollipop принес с собой возможность изменить цвет строки состояния в вашем приложении для более захватывающего взаимодействия с пользователем и в соответствии с Google Material Design Guidelines.

Вот как вы можете изменить цвет строки состояния, используя новый window.setStatusBarColorметод, представленный в API level 21.

Изменение цвета строки состояния также требует установки двух дополнительных флагов в окне; вам нужно добавить FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSфлаг и очистить FLAG_TRANSLUCENT_STATUSфлаг.

Рабочий код:

import android.view.Window;

...

Window window = activity.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(ContextCompat.getColor(activity,R.color.my_statusbar_color));

Официальная ссылка для разработчика: setStatusBarColor (int)

Пример: материал-дизайн-везде

Блог Криса Банеса - appcompat v21: дизайн материала для устройств перед леденцом на палочке!

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

Для transitionNameпросмотра фона будет android:status:background.


2
Любое решение для обратной совместимости?
— Адам Гурвиц

Как отмечено в ответе Нильса: вы также можете настроить цвет строки состояния с помощью темы / стиля, установив android:statusBarColorв своем values-v21/styles.xmlфайле настройки для androiddocs.com/training/material/theme.html примерно так<item name="android:statusBarColor">@color/primary_color</item>
— JL West,

4
я могу изменить цвет строки состояния на белый, но я не вижу значок уведомления, как батарея, как я могу решить эту проблему?
— MNFS

1
ты не представляешь, как сильно ты мне только что помог ..
— Абхишек Дхьяни

223

Поместите это ваши значения-v21 / styles.xml, чтобы включить это на Lollipop:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">@color/color_primary</item>
    </style>
</resources>

34
это требует мин API 21
— Roman

50
Вероятно, поэтому он предложил поместить его в values-v21 / styles.xml ;-) Кажется, это самый точный ответ на сегодняшний день !!
— Левит

Но это все еще предупреждает !!
— Нихал Шарма

что такое функция для compat? строка состояния
— BlackHawk

Вы можете добавить targeApiатрибут, если хотите сохранить единый файл стиля. Прочитайте мой ответ для справки stackoverflow.com/a/48565459/4291272
— Фейсал Шейх

50

это очень простой способ сделать это без какой-либо библиотеки: если версия ОС не поддерживается - под kitkat - значит, ничего не произойдет. я делаю это шаги:

  1. в моем XML я добавил к вершине это представление:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

Затем я сделал этот метод:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

Также вам нужны оба этих метода, чтобы получить панель действий и высоту строки состояния:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

тогда единственное, что вам нужно, это строка для установки цвета строки состояния:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

1
куда я должен поместить элемент вида? это должно быть сверху основного макета?
— Эмиль Ренья Энрикес

Да. В твоем xml. На вершине этого.
— Ижар

Внимание: работает только для Android> = 19 API. В моем случае мне нужна поддержка, начиная с 16
— Антон Кизема

setStatusBarColor (findViewById (android.R.id.statusBarBackground), GetResources () GetColor (android.R.color.white).);
— AndroidLad

34

Как сказал @Niels, вы должны поместить в values-v21 / styles.xml:

<item name="android:statusBarColor">@color/black</item>

Но добавьте, tools:targetApi="lollipop"если вы хотите один файл styles.xml, например:

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>

3
Большое спасибо за "targetApi". Мне не нравится, когда моя тема распространяется по нескольким файлам. :)
— сплетение

31

Что ж, решение Izhar было в порядке, но лично я стараюсь избегать кода, который выглядит так:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};

Также я не люблю дублировать код. В вашем ответе я должен добавить такую ​​строку кода во все виды деятельности:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

Итак, я взял решение Izhar и использовал XML, чтобы получить тот же результат: создать макет для StatusBar status_bar.xml

<View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/statusBarHeight"
     android:background="@color/primaryColorDark"
     android:elevation="@dimen/statusBarElevation">

Обратите внимание на атрибуты высоты и высоты, которые будут установлены в значениях values-v19, values-v21 далее.

Добавьте этот макет в макет ваших действий, используя include, main_activity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

Для панели инструментов добавьте атрибут верхнего поля:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">

В вашем appTheme style-v19.xml и styles-v21.xml добавьте windowTranslucent attr:

styles-v19.xml, v21:

<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>

И, наконец, в ваших измерениях Divens-v19, Dimens-v21 добавьте значения для topMargin панели инструментов и высоту statusBarHeight: dimensions.xml для меньшего размера, чем KitKat:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

Высота строки состояния всегда составляет 24dp измерения-v19.xml для KitKat и выше:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

Dimens-v21.xml для Lolipop, просто добавьте высоту, если необходимо:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

Это результат для Jellybean KitKat и Lollipop:

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


Таким образом, вместо того, чтобы помещать чек в код, вы помещаете его в XML. Ваше решение будет работать на Kitkat, так же, как он получил.
— Android-разработчик

26

Вы можете использовать этот простой код:

Однострочник в Котлине:

window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)

Оригинальный ответ с проверкой версии Java и вручную:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}

Вы можете еще больше упростить это с помощью ContextCompat. В Котлин тогда только это:window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
— sunadorer

К тому времени, когда я написал это, я еще не пробовал kotlin. Почему бы вам не отредактировать ответ, и я могу одобрить его :)
— steve moretz

Хорошая идея. Я включил свое предложение в ответ в качестве легкой ссылки для будущих посетителей
— sunadorer

Цвет строки состояния изменился выше Build.VERSION_CODES.M. не работает ниже Lollipop
— Мухаммед Харис

@ MuhammedHaris это работает. Вы использовали кодлин или код Java?
— Стив Моретц

23

Просто создайте новую тему в файле res / values ​​/ styles.xml, где вы измените «colorPrimaryDark», который является цветом строки состояния:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

И измените тему действия в AndroidManifest.xml на ту, которую вы хотите, в следующем упражнении вы можете изменить цвет обратно на исходный, выбрав исходную тему:

<activity
    android:name=".LoginActivity"
    android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Вот как должен выглядеть ваш res / values ​​/ colors.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>

1
Я думаю, что это самое простое, но самое чистое решение. Не нужно иметь минимальный уровень API 21 , просто переопределение. Заслуживает большего количества голосов.
— tahsinRupam

Это не сработало при работе на Nougat и уровне API, равном 19. Это сработало, если я установил android: theme под узлом приложения в манифесте.
— AndroidDev

18

Чтобы изменить цвет для вышеупомянутого lolipop просто добавьте это к вашему styles.xml

<item name="android:statusBarColor">@color/statusBarColor</item>

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

<item name="android:windowLightStatusBar">true</item>

1
Спасибо, это тоже полезный ответ.
— Эндрю Гроу

16

С помощью этой функции вы можете изменить цвет строки состояния. работает на Android L означает API 21 и выше и нуждается в цветовой строке, такие как "#ffffff".

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

15

У меня было это требование: программно изменить цвет строки состояния, оставив его прозрачным , чтобы панель навигации могла рисовать себя, перекрывая прозрачную строку состояния.

Я не могу сделать это с помощью API

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

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

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

Я могу управлять цветом и прозрачностью строки состояния следующим образом:

  • Android 4: вы мало что можете сделать, потому что вы не можете управлять цветом строки состояния из API ... единственное, что вы можете сделать, это установить строку состояния как полупрозрачную и переместить цветной элемент вашего пользовательского интерфейса под статусом бар. Для этого нужно поиграть с

    android:fitsSystemWindows="false"

    в вашем основном макете. Это позволяет вам нарисовать макет под строкой состояния. Затем вам нужно поиграть с отступом в верхней части основного макета.

  • Android 5 и выше: вы должны определить стиль с

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

    это позволяет навигационной панели перекрывать строку состояния.

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

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))

    где BoxLayout определяется следующим образом

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

У меня это работало без <item name="android:windowDrawsSystemBarBackgrounds">true</item>. Во всяком случае, после нескольких дней поиска я нашел кое-что, что действительно работает (на данный момент проверено только на Lolllipop). Спасибо
— DenisGL

У меня была такая же проблема, и ваш ответ помог мне решить эту проблему.
— А.Гун

7

Отредактируйте colorPrimary в colors.xml в Values, чтобы цвет, которым вы хотите, чтобы была строка состояния. Например:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>


7

Для изменения цвета строки состояния перейдите res/values-v21/styles.xmlи на цвет строки состояния

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">#0000FF</item>
    </style>
</resources>

Эй, не могли бы вы помочь мне? Я понятия не имею об Android, и я не могу начать учиться сейчас. У меня есть простое приложение ведьма запускает HTML-файл. Я умираю, чтобы изменить цвет строки состояния, потому что этот верх и низ на # 000 ужасен для моей палитры. Но я просто не могу, я даже не могу найти файл styles.xml ... Если бы я мог прислать вам мой apk, а вы мне его установили, я буду очень благодарен!
— Тьяго Собра

6

Если вы хотите изменить цвет строки состояния программно (и при условии, что устройство имеет Android 5.0). Это простой способ изменить statusBarColor из любого Activity и очень простой метод, когда разные фрагменты имеют разный цвет строки состояния.

 /**
 * @param colorId id of color
 * @param isStatusBarFontDark Light or Dark color
 */
fun updateStatusBarColor(@ColorRes colorId: Int, isStatusBarFontDark: Boolean = true) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.statusBarColor = ContextCompat.getColor(this, colorId)
        setSystemBarTheme(isStatusBarFontDark)
    }
}

/** Changes the System Bar Theme.  */
@RequiresApi(api = Build.VERSION_CODES.M)
private fun setSystemBarTheme(isStatusBarFontDark: Boolean) {
    // Fetch the current flags.
    val lFlags = window.decorView.systemUiVisibility
    // Update the SystemUiVisibility depending on whether we want a Light or Dark theme.
    window.decorView.systemUiVisibility = if (isStatusBarFontDark) lFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() else lFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}

5

Если вы хотите работать на Android 4.4 и выше, попробуйте это. Я имею в виду ответ Harpreet и эту ссылку. Android и прозрачная строка состояния

Сначала вызовите метод setStatusBarColored в методе onCreate в Activity (я поместил его в класс util). Я использую изображение здесь, вы можете изменить его, чтобы использовать цвет.

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Перед: перед

После: после

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }

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

статус бар


4

Это то, что работало для меня в KitKat и с хорошими результатами.

public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }

2

Еще одно решение:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);

Будет ли это работать на планшетах, где строка состояния находится внизу экрана?
— guy.gc

6
что здесь "w" и "UiUtil"?
— Манав Патадия

2

замените colorPrimaryDark на нужный вам цвет в файле res / values ​​/ styles.xml

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.