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 AppCompat’s 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.