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

146

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

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

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

tyczj
источник
Вы пытались использовать SystemBarTint lib? github.com/jgilfelt/SystemBarTint
Никола Деспотоски

Ответы:

420

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

Если вы хотите изменить цвет строки состояния программно (и при условии, что устройство имеет 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>
Матяш
источник
1
ах хорошо, я не использовалgetWindow()
tyczj
это может произойти сбой, когда код LOLLIPOP не найден в старых андроидах. лучше всего использовать> = 21
code511788465541441
12
@ code578841441 На самом деле этого не должно быть. Константы встраиваются при компиляции.
Матиаш
4
@ code578841441: Это потому, что вы компилируете со старым SDK. Вы всегда должны стремиться к компиляции с последним Android SDK, даже если у вас есть более старые ограничения версии API (то есть minSdkVersionи / или targetSdkVersionатрибуты на <uses-sdk ...>элементе).
дБмВт
3
Мне также пришлось вызвать getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); чтобы заставить его работать
Филипп Е.
61

Существуют различные способы изменения цвета строки состояния.

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.

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

Аритра Рой
источник
это выглядит как window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); не нужен - но этот работал для меня
bkurzius
Любые идеи, почему программная версия будет работать, но версия стиля не работает?
Андрей
В моем случае в стиле действия был установлен flah translucent_status, поэтому без команды window.clearFlags это не сработало. Так что спасибо вам за это!
BMacedo
Ух ты! Это должен быть принят ответ, добавить clearFlagsисправить мою проблему
fanjavaid
9

Я не думаю, что цвет строки состояния был реализован в 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 )

JstnPwll
источник
1
Вполне возможно, что он никогда не будет реализован в AppCompat, если более старые версии ОС не позволяют изменять строку состояния.
TheIT
2
<attr name = "colorPrimaryDark" format = "color" /> <! - темный вариант основного фирменного цвета. По умолчанию это цвет, применяемый к строке состояния (через statusBarColor) и к панели навигации (через navigationBarColor). ->
Сохейл Сетаеши
3

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

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>
Манодж Кумар
источник
1

Спасибо за ответы выше, с помощью тех, после определенных R & D для приложения 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 указано.

Pallavi
источник
1

[Версия 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
    }
}
Хулиан Фальчионелли
источник
0

применение

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

у Theme.AppCompat.Light.DarkActionBarменя не сработало. Что сделал трюк, выдавая colorPrimaryDarkкак обычно вместе с android:colorPrimarystyles.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);
                }

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

Annu
источник