Змініть колір рядка стану за допомогою AppCompat ActionBarActivity


145

В одному зі своїх заходів я змінив колір панелі інструментів за допомогою Palette. Але на 5.0 пристроїв , що використовують ActionBarActivityв status barколір є колір моєї colorPrimaryDarkв моїй темі діяльності , так у мене є 2 дуже різні кольори , і це не виглядає добре.

Я розумію, що в 5.0 ви можете використовувати, Window.setStatusBarColor()але ActionBarActivityцього не має.

тому моє питання в 5.0 як я можу змінити колір рядка стану ActionBarActivity?


Ви намагалися використовувати lib SystemBarTint? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

Відповіді:


419

Я не впевнений, що розумію проблему.

Я хочу змінити колір рядка стану програмно (за умови, що на пристрої є 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 Власне, цього не повинно статися. Константи підкреслюються під час складання.
matiash

4
@ code578841441: Це тому, що ви компілюєте старіший SDK. Ви завжди повинні прагнути до компіляції з найновішим Android SDK, навіть якщо у вас є більш старі обмеження версії API (тобто minSdkVersionта / або targetSdkVersionатрибути <uses-sdk ...>елемента).
dbm

3
Я також повинен був викликати getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); щоб змусити його працювати
Philipp E.

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 відтінків основного кольору, який я використовую у своєму додатку. Ви можете визначити цей колір у файлі color.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 )


1
Можливо, що він ніколи не буде реалізований в AppCompat, якщо старіші версії ОС не надають можливості змінювати рядок стану.
THEIT

2
<attr name = "colorPrimaryDark" format = "color" /> <! - темний варіант основного кольору брендингу. За замовчуванням це колір, застосований до рядка стану (через statusBarColor) та панелі навігації (через navigationBarColor). ->
Soheil Setayeshi

3

Спробуйте це, я використав це, і це дуже добре працює з v21.

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

1

Дякуємо за вищенаведені відповіді, за допомогою тих, після певних досліджень та розробок для програми 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>

І в мене йдеться про Vcom appcompact.


1

[Версія Котліна] Я створив це розширення, яке також перевіряє, чи потрібний колір має достатню контрастність, щоб приховати системний інтерфейс, наприклад, значок статусу акумулятора, годинник тощо, тому ми встановимо системний інтерфейс білим або чорним відповідно до цього.

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

не потрібно було встановлювати колір коду смужки стану.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.