Ändern Sie die Farbe der Statusleiste mit AppCompat ActionBarActivity


145

In einer meiner Aktivitäten habe ich die Farbe der Symbolleiste mit geändert Palette. Aber auf 5,0 Geräte mit ActionBarActivityder status barFarbe ist die Farbe meiner colorPrimaryDarkin meiner Tätigkeit Thema so habe ich zwei sehr verschiedenen Farben und es sieht nicht gut aus.

Mir ist klar, dass Sie in 5.0 verwenden können, dies Window.setStatusBarColor()aber ActionBarActivitynicht haben.

Meine Frage ist also in 5.0. Wie kann ich die Farbe der Statusleiste ändern ActionBarActivity?


Haben Sie versucht, SystemBarTint lib zu verwenden? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

Antworten:


419

Ich bin mir nicht sicher, ob ich das Problem verstehe.

Wenn Sie die Farbe der Statusleiste programmgesteuert ändern möchten (und vorausgesetzt, das Gerät verfügt über Android 5.0), können Sie sie verwenden Window.setStatusBarColor(). Es sollte keinen Unterschied machen, ob die Aktivität von Activityoder abgeleitet ist ActionBarActivity.

Versuchen Sie es einfach:

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

Habe das gerade mit getestet ActionBarActivityund es funktioniert in Ordnung.


Hinweis: Das FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSprogrammgesteuerte Setzen des Flags ist nicht erforderlich, wenn Ihre values-v21Stildatei es bereits gesetzt hat:

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

1
ah ok ich habe nicht benutztgetWindow()
tyczj

Dies würde abstürzen, wenn Code LOLLIPOP in alten Androiden nicht gefunden wird. es ist am besten zu verwenden> = 21
code511788465541441

12
@ code578841441 Eigentlich sollte das nicht passieren. Konstanten werden beim Kompilieren eingefügt.
Matiash

4
@ code578841441: Das liegt daran, dass Sie mit einem älteren SDK kompilieren. Sie sollten immer versuchen , mit dem neuesten Android SDK zu kompilieren , auch wenn Sie ältere API-Versionsbeschränkungen (dh minSdkVersionund / oder targetSdkVersionAttribute für das <uses-sdk ...>Element) haben.
DBM

3
Ich musste auch getWindow () aufrufen. AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); damit es funktioniert
Philipp E.

61

Es gibt verschiedene Möglichkeiten, die Farbe der Statusleiste zu ändern.

1) Verwenden Sie die Datei styles.xml. Sie können das Attribut android: statusBarColor verwenden, um dies auf einfache, aber statische Weise zu tun.

Hinweis: Sie können dieses Attribut auch mit dem Material-Thema verwenden.

<?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) Sie können dies dynamisch mit der Methode setStatusBarColor (int) in der Window-Klasse ausführen. Beachten Sie jedoch, dass diese Methode nur für API 21 oder höher verfügbar ist. Überprüfen Sie dies also unbedingt, da Ihre App sonst auf niedrigeren Geräten abstürzt.

Hier ist ein Arbeitsbeispiel für diese Methode.

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

Dabei ist primaryDark die 700-Tönung der Primärfarbe, die ich in meiner App verwende. Sie können diese Farbe in der Datei colours.xml definieren.

Probieren Sie es aus und lassen Sie mich wissen, wenn Sie Fragen haben. Ich hoffe es hilft.


es sieht aus wie window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); wird nicht benötigt - aber dieser hat für mich
funktioniert

Irgendwelche Ideen, warum die programmatische Version funktionieren würde, die Stilversion jedoch nicht?
Andrew

In meinem Fall war für den Stil der Aktivität der flah translucent_status festgelegt, sodass er ohne den Befehl window.clearFlags nicht funktionierte. Also danke dafür!
BMacedo

Oh wow! Diese Antwort sollte akzeptiert werden, füge clearFlagsmein Problem hinzu
fanjavaid

9

Ich glaube nicht, dass die Farbe der Statusleiste in AppCompat implementiert wurde. Dies sind die Attribute, die verfügbar sind:

    <!-- ============= -->
    <!-- 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" />

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


1
Es ist möglich, dass es niemals in AppCompat implementiert wird, wenn die älteren Betriebssystemversionen keine Möglichkeit bieten, die Statusleiste zu ändern.
TheIT

2
<attr name = "colorPrimaryDark" format = "color" /> <! - Dunkle Variante der primären Markenfarbe. Standardmäßig ist dies die Farbe, die auf die Statusleiste (über statusBarColor) und die Navigationsleiste (über navigationBarColor) angewendet wird. ->
Soheil Setayeshi

3

Versuchen Sie dies, ich habe dies verwendet und es funktioniert sehr gut mit v21.

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

1

Vielen Dank für die obigen Antworten, mit deren Hilfe nach bestimmten F & E für xamarin.android MVVMCross-Anwendung unten funktioniert hat

Flag, das für die Aktivität in der Methode OnCreate angegeben wurde

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

Für jede MvxActivity wird das Thema wie folgt erwähnt

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

Meine SplashStyle.xml sieht wie folgt aus

<?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>

Und ich habe V7 Appcompact verwiesen.


1

[Kotlin-Version] Ich habe diese Erweiterung erstellt, die auch prüft, ob die gewünschte Farbe genügend Kontrast hat, um die System-Benutzeroberfläche auszublenden, z. B. das Batteriestatus-Symbol, die Uhr usw., sodass wir die System-Benutzeroberfläche entsprechend weiß oder schwarz einstellen.

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

Bewirbt sich

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

in Theme.AppCompat.Light.DarkActionBarhat bei mir nicht funktioniert. Was der Trick getan hat, ist, colorPrimaryDarkwie gewohnt zusammen mit android:colorPrimaryin styles.xml zu geben

<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>

und in der Einstellung

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

musste die Farbe der Statusleiste im Code nicht einstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.