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

427

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

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

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

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

codercat
источник
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.

codercat
источник
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));
itzhar
источник
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>
lcompare
источник
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">
DSoldo
источник
У меня это работало без <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>

PHILIPS
источник
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
}
Nabin
источник
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));
        }
    }
Harpreet
источник
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>
Энгр Сайед Роушан Али
источник