Измените цвет строки состояния с помощью AppCompat ActionBarActivity

В одном из своих заданий я изменил цвет панели инструментов с помощью Palette. Но на устройствах 5.0, использующих ActionBarActivity цвет status bar - это цвет моего colorPrimaryDark в моей теме деятельности, поэтому у меня есть 2 очень разных цвета, и это выглядит не очень хорошо.

Я понимаю, что в 5.0 вы можете использовать Window.setStatusBarColor(), но ActionBarActivity этого не имеет.

так что мой вопрос в 5.0, как я могу изменить цвет строки состояния с помощью ActionBarActivity?


person tyczj    schedule 02.11.2014    source источник
comment
Вы пробовали использовать библиотеку SystemBarTint? github.com/jgilfelt/SystemBarTint   -  person Nikola Despotoski    schedule 05.11.2014


Ответы (9)


Не уверен, что понимаю проблему.

Если вы хотите программно изменить цвет строки состояния (и при условии, что на устройстве установлена ​​ОС Android 5.0), вы можете использовать Window.setStatusBarColor(). Не должно иметь значения, происходит ли действие от Activity или ActionBarActivity.

Просто попробуйте сделать:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.BLUE);
}

Просто протестировал это с помощью ActionBarActivity, и он работает нормально.


Примечание. Программная установка флага FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS не требуется, если в вашем файле стилей values-v21 он уже установлен, с помощью:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
person matiash    schedule 05.11.2014
comment
ах ок, я не использовал getWindow() - person tyczj; 05.11.2014
comment
это приведет к сбою, если код LOLLIPOP не найден в старых андроидах. лучше всего использовать ›= 21 - person code511788465541441; 17.11.2014
comment
@ code578841441 На самом деле этого не должно быть. Константы встроены при компиляции. - person matiash; 17.11.2014
comment
@ code578841441: Это потому, что вы компилируете более старый SDK. Вы всегда должны стремиться к компиляции с использованием последней версии Android SDK, даже если у вас есть более старые ограничения версии API (например, атрибуты minSdkVersion и / или targetSdkVersion в элементе <uses-sdk ...>). - person dbm; 22.11.2014
comment
Мне также пришлось вызвать getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); заставить это работать - person Philipp E.; 30.11.2014
comment
Как это сделать для всего приложения, а не только для деятельности? - person SpaceMonkey; 13.09.2015
comment
@Spacemonkey Установив android:statusBarColor в вашей теме. - person matiash; 14.09.2015
comment
@matiash я имел в виду программно - person SpaceMonkey; 14.09.2015
comment
@Spacemonkey О ... я ни о чем не знаю. Вам нужно вызывать setStatusBarColor() в каждом onCreate() действия (или, конечно, в базовом классе для всех действий). - person matiash; 14.09.2015
comment
Обратите внимание, что цвет int должен быть получен как getColor(res_id), если цвет взят из ваших цветов xml. - person htafoya; 02.06.2017
comment
getWindow () не существует в контексте страницы. Как ты пользуешься? - person Bruno Costa; 07.08.2017
comment
Я хочу изменить цвет на белый, но значки тоже останутся белыми, поэтому они исчезнут - person Daniel Beltrami; 10.10.2018

Есть разные способы изменить цвет строки состояния.

1) Используя файл styles.xml. Вы можете использовать атрибут android: statusBarColor, чтобы сделать это простым, но статичным способом.

Примечание. Вы также можете использовать этот атрибут с темой «Материал».

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) Вы можете сделать это динамически, используя метод setStatusBarColor (int) в классе Window. Но помните, что этот метод доступен только для API 21 или выше. Поэтому обязательно проверьте это, иначе ваше приложение обязательно выйдет из строя на более низких устройствах.

Вот рабочий пример этого метода.

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

где primaryDark - это оттенок 700 основного цвета, который я использую в своем приложении. Вы можете определить этот цвет в файле colors.xml.

Попробуйте и дайте мне знать, если у вас возникнут вопросы. Надеюсь, это поможет.

person Aritra Roy    schedule 11.01.2015
comment
это выглядит как window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); не нужен - но этот сработал для меня - person bkurzius; 10.02.2015
comment
Есть идеи, почему программная версия будет работать, а версия стиля - нет? - person Andrew; 13.11.2015
comment
В моем случае для стиля активности был установлен flah translucent_status, поэтому без команды window.clearFlags это не сработало. Так что спасибо вам за это! - person BMacedo; 29.12.2016
comment
Ух ты! Это должен быть принятый ответ, добавьте clearFlags исправить мою проблему - person fanjavaid; 23.12.2017

Я не думаю, что цвет строки состояния еще реализован в AppCompat. Доступны следующие атрибуты:

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

(Из \ sdk \ extras \ android \ support \ v7 \ appcompat \ res \ values ​​\ attrs.xml)

person JstnPwll    schedule 04.11.2014
comment
Возможно, это никогда не будет реализовано в AppCompat, если более старые версии ОС не предоставляют возможности изменять строку состояния. - person TheIT; 19.03.2015
comment
‹Attr name = colorPrimaryDark format = color /› ‹! - Темный вариант основного цвета брендинга. По умолчанию это цвет, применяемый к строке состояния (через statusBarColor) и панели навигации (через navigationBarColor). - › - person Soheil Setayeshi; 29.03.2015

Попробуйте это, я использовал это, и он очень хорошо работает с v21.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>
person Manoj Kumar    schedule 18.01.2016

[Версия Kotlin] Я создал это расширение, которое также проверяет, имеет ли желаемый цвет достаточный контраст, чтобы скрыть системный интерфейс, например значок состояния батареи, часы и т. Д., Поэтому мы устанавливаем системный интерфейс белым или черным в соответствии с этим.

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
    var flags: Int = window.decorView.systemUiVisibility // get current flags
    var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    var setSystemUILight = lightSystemUI

    if (setSystemUILight == null) {
        // Automatically check if the desired status bar is dark or light
        setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
    }

    flags = if (setSystemUILight) {
        // Set System UI Light (Battery Status Icon, Clock, etc)
        removeFlag(flags, systemLightUIFlag)
    } else {
        // Set System UI Dark (Battery Status Icon, Clock, etc)
        addFlag(flags, systemLightUIFlag)
    }

    window.decorView.systemUiVisibility = flags
    window.statusBarColor = color
}

private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0

private fun addFlag(flags: Int, flagToAdd: Int): Int {
    return if (!containsFlag(flags, flagToAdd)) {
        flags or flagToAdd
    } else {
        flags
    }
}

private fun removeFlag(flags: Int, flagToRemove: Int): Int {
    return if (containsFlag(flags, flagToRemove)) {
        flags and flagToRemove.inv()
    } else {
        flags
    }
}
person Julián Falcionelli    schedule 14.07.2020

Спасибо за приведенные выше ответы, с их помощью, после определенных исследований и разработок для приложения xamarin.android MVVMCross, ниже работало

Флаг, указанный для активности в методе OnCreate

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

Для каждого MvxActivity тема упоминается, как показано ниже.

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

Мой SplashStyle.xml выглядит так, как показано ниже

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

И у меня есть V7 appcompact.

person Pallavi    schedule 26.07.2017

Применение

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

в Theme.AppCompat.Light.DarkActionBar у меня не сработало. В чем заключалась хитрость, давая colorPrimaryDark как обычно вместе с android:colorPrimary в файле styles.xml

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

и в установке

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Window window = this.Window;
                    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                }

не нужно было устанавливать цвет строки состояния в коде.

person Annu    schedule 21.09.2018

Это можно реализовать, если вы используете Kotliln в Android:

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.statusBarColor = Color.WHITE
person Bishrul Haq    schedule 15.03.2021

добавьте этот kotlin код в OnCreate() из Activity или Fragment:

  if (Build.VERSION.SDK_INT >= 21) {
            val window: Window = requireActivity().window
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            window.statusBarColor = resources.getColor(R.color.very_light_pink)
        }
person sana ebadi    schedule 18.03.2021