Wie ändere ich die Farbe der Statusleiste, um sie an die App in Lollipop anzupassen? [Android]

96

Beim neuen Lollipop-Update habe ich festgestellt, dass sich bei den nativen Google-Apps die Farbe der Statusleiste ändert, um mit der Aktionsleiste der App übereinzustimmen, die Sie ausführen. Ich sehe es auch in der Twitter-App, also denke ich, dass es nicht ausschließlich Google ist, der das kann.

Weiß jemand, wie man das macht, wenn es möglich ist?

Briscoooe
quelle

Antworten:

220

Verwenden Sie setStatusBarColor (int color), um die Farbe der Statusleiste zu ändern . Laut Javadoc müssen wir auch einige Flaggen am Fenster setzen.

Arbeitsausschnitt des Codes:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(activity, R.color.example_color));


Beachten Sie, dass die Farbe der Statusleiste und die Farbe der Aktionsleiste gemäß den Richtlinien für Materialdesign unterschiedlich sein sollten:

  • ActionBar sollte die Primärfarbe 500 verwenden
  • Die Statusleiste sollte die Primärfarbe 700 verwenden

Schauen Sie sich den Screenshot unten an:

Geben Sie hier die Bildbeschreibung ein

klimat
quelle
4
Beachten Sie, dass der Effekt möglicherweise nicht im Emulator angezeigt wird. Zum Beispiel dieses Beispielprojekt färbt die Statusleiste auf einem Nexus 9 , aber nicht auf einem Android - 5.0 - Emulator.
CommonsWare
1
@mate: Ich bezog mich auf den Android SDK-Emulator. Gut zu wissen, dass es an Genymotion arbeitet.
CommonsWare
3
@ Azad Nein, das ist nicht der Fall. Um den obigen Codeausschnitt verwenden zu können, müssen Sie sicherstellen, dass Ihr Gerät unter API 21 oder höher ausgeführt wird.
klimat
1
Ich arbeite an einem relativ einfachen Projekt und ich muss sagen, dass ich es gerade benutzt habe getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));und es perfekt funktioniert hat. Ich bin mir nicht sicher über den Kontext, in dem die Flags unbedingt erforderlich sind.
Joaquin Iurchuk
3
Ich möchte die Farbe auch in Pre-Lollipop-Geräten anzeigen. Wie geht das?
WISHY
48

Fügen Sie dies einfach in Ihre styles.xml ein. Das colorPrimary ist für die Aktionsleiste und das colorPrimaryDark ist für die Statusleiste.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
</style>

Dieses Bild von Entwickler Android erklärt mehr über Farbpalette. Sie können mehr über diesen Link lesen .

Geben Sie hier die Bildbeschreibung ein

Gjoko Bozinov
quelle
Android Studio erstellt für jedes Projekt die folgenden Einträge: <color name="colorPrimary">#somecolor</color>und <color name="colorPrimaryDark">#somecolor</color>. Sie können geändert werden, um den gewünschten Effekt zu erzielen.
Neurotransmitter
41

Eine andere Möglichkeit, die Farbe der Statusleiste festzulegen, ist die Datei style.xml .

Erstellen Sie dazu eine style.xml- Datei im Ordner res / values-v21 mit folgendem Inhalt:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material">
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="android:colorPrimaryDark">@color/blue_dark</item>
    </style>
</resources>

Bearbeiten: Wie in den Kommentaren erwähnt, ist der Code bei Verwendung von AppCompat anders. Verwenden Sie in der Datei res / values ​​/ style.xml stattdessen:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">   
    <!-- Set AppCompats color theming attrs -->
    <item name="colorPrimary">@color/my_awesome_red</item>
    <item name="colorPrimaryDark">@color/my_awesome_darker_red</item>
    <!-- Other attributes -->
</style>
Alberto Malagoli
quelle
1
Tat dies. Hat aber nicht funktioniert. Aber dann benutze ich AppCompat anstelle von Material.
Martin
3
@Martin Verwenden Sie für Appcompat colorPrimaryDark ohne das Android-Präfix.
Michiel
funktioniert auch nicht für Appcompat (getestet auf Level 18)
Mohammad Zekrallah
Die Farbe der Statusleiste funktioniert nur auf Geräten mit OS API Level 21 und höher. Stellen Sie außerdem in Ihrem Manifest sicher, dass Sie diesen Stil bei einzelnen Aktivitäten nicht überschreiben.
Levon
für inappbrowser, wie man die Farbe der Suchleiste wie die Farbe der App
ändert
23

Erstellen Sie zum Festlegen der Farbe der Statusleiste eine Datei style.xml im Ordner res / values-v21 mit folgendem Inhalt:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppBaseTheme" parent="AppTheme">
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/blue</item>
    </style>

</resources>
Muhammad Aamir Ali
quelle
Es heißt, dass das Symbol windowDrawsSystemBarBackgrounds
jmhostalet
4

Fügen Sie diese Zeile im Stil von v21 hinzu, wenn Sie zwei Stile verwenden.

  <item name="android:statusBarColor">#43434f</item>
Amit Walke
quelle
Dies funktioniert nicht ohne Flagandroid:windowDrawsSystemBarBackgrounds
Slav
4

Auch wenn Sie unterschiedliche status-barFarben für unterschiedliche Aktivitäten ( Fragmente) wünschen ) , können Sie dies mit den folgenden Schritten tun (Arbeiten an API 21 und höher):

Erstellen Sie zuerst values21/style.xmlden folgenden Code und fügen Sie ihn ein:

 <style name="AIO" parent="AIOBase">
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:windowContentTransitions">true</item>
    </style>

Definieren Sie dann Weiß | Dunkel-Themen values/style.xmlwie folgt:

 <style name="AIOBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_primary_dark</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:textColorPrimary">@android:color/black</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@color/color_primary_dark
        </item>
        <item name="android:textColor">@color/gray_darkest</item>
        <item name="android:windowBackground">@color/default_bg</item>
        <item name="android:colorBackground">@color/default_bg</item>
    </style>


    <style name="AIO" parent="AIOBase" />

    <style name="AIO.Dark" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#171717
        </item>
    </style>

    <style name="AIO.White" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#bdbdbd
        </item>
    </style>

Vergessen Sie auch nicht, Themen in Ihrem anzuwenden manifest.xml.

Amir
quelle
2

In Android Pre Lollipop Geräten können Sie dies über SystemBarTintManager tun. Wenn Sie Android Studio verwenden, fügen Sie einfach Systembartint lib in Ihre Gradle-Datei ein.

dependencies {
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    ...
}

Dann in Ihrer Tätigkeit

// create manager instance after the content view is set
SystemBarTintManager mTintManager = new SystemBarTintManager(this);
// enable status bar tint
mTintManager.setStatusBarTintEnabled(true);
mTintManager.setTintColor(getResources().getColor(R.color.blue));
Muhammad Aamir Ali
quelle