Come cambiare il colore della barra di stato per abbinare l'app in Lollipop? [Android]


96

Nel nuovo aggiornamento lecca-lecca ho notato che con le app Google native il colore della barra di stato cambia per corrispondere alla barra delle azioni sull'app che stai eseguendo. Vedo che è anche sull'app di Twitter, quindi immagino che non sia esclusivamente Google a farlo.

Qualcuno sa come farlo se è possibile?

Risposte:


220

Per cambiare il colore della barra di stato usa setStatusBarColor (int color) . Secondo javadoc, abbiamo anche bisogno di impostare alcuni flag sulla finestra.

Snippet di codice funzionante:

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


Tieni presente che, in base alle linee guida di Material Design , il colore della barra di stato e il colore della barra delle azioni dovrebbero essere diversi:

  • ActionBar dovrebbe usare il colore primario 500
  • StatusBar dovrebbe utilizzare il colore primario 700

Guarda lo screenshot qui sotto:

inserisci qui la descrizione dell'immagine


4
Nota che l'effetto potrebbe non essere visualizzato nell'emulatore. Ad esempio, questo progetto di esempio colora la barra di stato su un Nexus 9 ma non su un emulatore Android 5.0.
CommonsWare

1
@mate: mi riferivo all'emulatore Android SDK. Buono a sapersi che funziona su Genmony.
CommonsWare

3
@ Azad No, non lo è. Per utilizzare lo snippet di codice sopra riportato, devi assicurarti che il tuo dispositivo funzioni con API 21 o versioni successive.
klimat

1
Sto lavorando a un progetto relativamente semplice e devo dire che l'ho appena usato getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));e ha funzionato perfettamente. Non sono sicuro del contesto in cui i flag sono strettamente necessari.
Joaquin Iurchuk

3
Voglio mostrare il colore anche nei dispositivi pre lecca-lecca. Come si può fare?
WISHY

48

Basta aggiungerlo in te styles.xml. ColorPrimary è per la barra delle azioni e colorPrimaryDark è per la barra di stato.

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

Questa immagine dello sviluppatore Android spiega di più sulla tavolozza dei colori. Puoi leggere di più su questo link .

inserisci qui la descrizione dell'immagine


Android Studio crea le seguenti voci per ogni progetto: <color name="colorPrimary">#somecolor</color>e <color name="colorPrimaryDark">#somecolor</color>. Possono essere modificati per ottenere l'effetto desiderato.
Neurotrasmettitore

41

Un altro modo per impostare il colore della barra di stato è tramite style.xml .

Per farlo, crea un file style.xml nella cartella res / values-v21 con questo contenuto:

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

Modifica: come sottolineato nei commenti, quando si utilizza AppCompat il codice è diverso. Nel file res / values ​​/ style.xml utilizzare invece:

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

1
Fatto quello. Ma non ha funzionato. Ma poi uso AppCompat invece di Material.
Martin

3
@Martin Per appcompat, usa colorPrimaryDark senza il prefisso Android.
Michiel

non funziona anche per appcompat (testato al livello 18)
Mohammad Zekrallah

Il colore della barra di stato funzionerà solo su dispositivi con OS API Level 21 e superiore. Inoltre, nel tuo manifest assicurati di non sovrascrivere questo stile nelle singole attività.
Levon

per inappbrowser come cambiare il colore della barra di ricerca come il colore dell'app
R.Anandan

23

Per impostare il colore della barra di stato, crea un file style.xml nella cartella res / values-v21 con questo contenuto:

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

dice che non è possibile risolvere il simbolo windowDrawsSystemBarBackgrounds
jmhostalet

4

Aggiungi questa linea nello stile della v21 se usi due stili.

  <item name="android:statusBarColor">#43434f</item>

Questo non funziona senza impostare la bandieraandroid:windowDrawsSystemBarBackgrounds
Slav

4

Inoltre, se vuoi status-barcolori diversi per attività diverse ( fragments ), puoi farlo con i seguenti passaggi (lavora su API 21 e superiori):

Per prima cosa crea values21/style.xmle inserisci il seguente codice:

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

Quindi definisci i temi White | Dark values/style.xmlcome segue:

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

Inoltre, non dimenticare di applicare temi nel tuo file manifest.xml.


2

Nei dispositivi Android pre Lollipop puoi farlo da SystemBarTintManager Se stai usando Android Studio aggiungi semplicemente Systembartint lib nel tuo file gradle.

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

Poi nella tua attività

// 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));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.