Come cambiare il colore della barra di stato in Android?


427

Prima di tutto non è un duplicato come in Come cambiare il colore di sfondo della barra di stato di Android

Come posso cambiare il colore della barra di stato che dovrebbe essere uguale a quello nella barra di navigazione.

Voglio che il colore della barra di stato sia uguale al colore della barra di navigazione

inserisci qui la descrizione dell'immagine


2
è possibile solo dopo kitkat @MarkBuikema
codercat

4
Come suggerisce Niels, esiste un ATTRIBUTO TEMA da quando è stato chiamato v21 android:statusBarColor. Puoi semplicemente aggiungerlo a values-v21/styles.xml.
Levite,

@MarkBuikema Che relazione c'è anche con l'accesso root!
Steve Moretz,

Risposte:


625

Android 5.0 Lollipop ha introdotto il tema Material Design che colora automaticamente la barra di stato in base al colorPrimaryDark valore del tema.

Questo è supportato sul dispositivo pre-lollipop grazie alla libreria support-v7-appcompat a partire dalla versione 21. Blogpost sul supporto appcompat v21 di Chris Banes

inserisci qui la descrizione dell'immagine

Maggiori informazioni sul tema materiale sul sito Web ufficiale degli sviluppatori Android


29
per qualche motivo l'attributo colorPrimaryDark non funziona per me. provato sull'emulatore v21
deviante

3
Funziona devi vedere le modifiche sull'emulatore non
sull'anteprima

6
colorPrimaryDark non funziona neanche su un emulatore API 18. Dall'articolo collegato su appcompat: "Su piattaforme più vecchie, AppCompat emula il tema del colore ove possibile. Al momento questo è limitato alla colorazione della barra delle azioni e di alcuni widget".
Adam Johns,

12
Che ne dici di cambiare il colore del carattere nella barra di stato? I documenti non dicono nulla al riguardo.
Scott Biggs,

Ho provato allo stesso modo. funziona perfettamente nella maggior parte dei dispositivi, ma ho samsung galaxy s4 con OS 5.0.1 e in questa barra di stato il colore è nero. E una volta che vado a un'altra attività e ritorna a un'attività precedente, il mio colore della barra di stato viene cambiato in colore del tema dell'app. Qualsiasi motivo per cui questo sta accadendo
Hitesh Kamani,

364

Aggiornare:

Lecca-lecca:

public abstract void setStatusBarColor (int color)

Aggiunto nel livello API 21

Android Lollipop ha portato con sé la possibilità di cambiare il colore della barra di stato nella tua app per un'esperienza utente più coinvolgente e in sintonia con Google Material Design Guidelines .

Ecco come è possibile modificare il colore della barra di stato utilizzando il nuovo window.setStatusBarColormetodo introdotto inAPI level 21 .

La modifica del colore della barra di stato richiede anche l'impostazione di due flag aggiuntivi sulla finestra; devi aggiungere il FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSflag e cancellare ilFLAG_TRANSLUCENT_STATUS bandiera.

Codice di lavoro:

import android.view.Window;

...

Window window = activity.getWindow();

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));

Riferimento dello sviluppatore ufficiale: setStatusBarColor (int)

Esempio: materiale-design-ovunque

Chris Banes Blog- appcompat v21: design materiale per dispositivi pre-Lollipop!

inserisci qui la descrizione dell'immagine

Lo sarà transitionNameper lo sfondo della vista android:status:background.


2
Qualche soluzione per la retrocompatibilità?
Adam Hurwitz,

Come notato nella risposta di Niels: puoi anche configurare il colore della barra di stato tramite tema / stile impostando il android:statusBarColortuo values-v21/styles.xmlfile per androiddocs.com/training/material/theme.html in questo modo<item name="android:statusBarColor">@color/primary_color</item>
JL West

4
posso cambiare il colore della barra di stato in bianco, ma non riesco a vedere l'icona di notifica come batery, come posso risolverlo?
MNFS,

1
non hai idea di quanto mi hai appena aiutato ..
Abhishek Dhyani,

222

Posiziona questo è il tuo valore-v21 / styles.xml, per abilitarlo su Lollipop:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">@color/color_primary</item>
    </style>
</resources>

34
ciò richiede l'API minima 21
Roman

49
Questo è probabilmente il motivo per cui ha suggerito di metterlo in valori-v21 / styles.xml ;-) Sembra essere la risposta più accurata finora !!
Levite,

Ma questo segnala ancora un avvertimento !!?
Nihal Sharma,

qual è la funzione per compat? barra di stato
blackHawk

puoi aggiungere un targeApiattributo se vuoi mantenere un singolo file di stile. Leggi la mia risposta per riferimento stackoverflow.com/a/48565459/4291272
Faisal Shaikh

50

questo è un modo molto semplice per farlo senza alcuna libreria: se la versione del sistema operativo non è supportata - sotto kitkat - quindi non succede nulla. faccio questi passaggi:

  1. nel mio XML ho aggiunto all'inizio questa vista:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

poi ho fatto questo metodo:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

inoltre hai bisogno di entrambi questi metodi per ottenere la barra delle azioni e l'altezza della barra di stato:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

quindi l'unica cosa di cui hai bisogno è questa linea per impostare il colore della barra di stato:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

1
dove devo mettere l'elemento view? dovrebbe essere in cima al layout principale?
Emil Reña Enriquez,

Sì. Nel tuo XML. Al vertice.
Itzhar

Attenzione: funziona solo per Android> = 19 API. Nel mio caso ho bisogno di supporto a partire dal 16
Anton Kizema, del

setStatusBarColor (findViewById (android.R.id.statusBarBackground), getResources () getColor (android.R.color.white).);
Androidad

34

Come ha detto @Niels, devi inserire i valori-v21 / styles.xml:

<item name="android:statusBarColor">@color/black</item>

Ma aggiungi tools:targetApi="lollipop"se vuoi single styles.xml, come:

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>

3
Grazie mille per "targetApi". Non mi piace che il mio tema sia distribuito su più file. :)
plesso il

31

Bene, la soluzione Izhar era OK ma, personalmente, sto cercando di evitare dal codice che assomiglia a questo:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};

Inoltre, non mi piace nemmeno duplicare il codice. Nella tua risposta devo aggiungere tale riga di codice in tutte le attività:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

Quindi, ho preso la soluzione Izhar e ho usato XML per ottenere lo stesso risultato: creare un layout per StatusBar status_bar.xml

<View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/statusBarHeight"
     android:background="@color/primaryColorDark"
     android:elevation="@dimen/statusBarElevation">

Notare gli attributi di altezza e quota, questi saranno impostati in valori, valori-v19, valori-v21 più in basso.

Aggiungi questo layout al layout delle tue attività usando include, main_activity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

Per la barra degli strumenti, aggiungi l'attributo margine superiore:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">

Nella tua app Theme style-v19.xml e styles-v21.xml, aggiungi la finestraTranslucent attr:

styles-v19.xml, v21:

<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>

E infine, sul tuo dimens, dimens-v19, dimens-v21, aggiungi i valori per Toolbar topMargin e l'altezza dello statusBarHeight: dimens.xml per meno di KitKat:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

L'altezza della barra di stato è sempre 24dp dimens-v19.xml per KitKat e versioni successive:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

dimens-v21.xml per Lolipop, basta aggiungere l'elevazione se necessario:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

Questo è il risultato per Jellybean KitKat e Lollipop:

inserisci qui la descrizione dell'immagine


Quindi, invece di inserire il codice di check in, lo hai inserito in XML. La tua soluzione funzionerà su Kitkat, proprio come quello che ha ottenuto.
Sviluppatore Android

26

Puoi usare questo semplice codice:

One-liner in Kotlin:

window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)

Risposta originale con Java e controllo manuale della versione:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}

È possibile semplificare ulteriormente utilizzando ContextCompat. A Kotlin è solo questo:window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
Sunadorer,

Quando l'ho scritto non avevo provato Kotlin. Perché non modifichi la risposta e posso approvarla :)
Steve Moretz,

Buona idea. Ho incluso il mio suggerimento nella risposta come semplice riferimento per i futuri visitatori
Sunadorer,

il colore della barra di stato è stato modificato sopra Build.VERSION_CODES.M. non funziona sotto Lollipop
Muhammed Haris il

@MuhammedHaris funziona. Hai usato il codice kotlin o java?
steve moretz,

23

Basta creare un nuovo tema in res / valori / styles.xml in cui si cambia "colorPrimaryDark" che è il colore della barra di stato:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

E modifica il tema dell'attività in AndroidManifest.xml a quello che desideri, sull'attività successiva puoi cambiare il colore a quello originale selezionando il tema originale:

<activity
    android:name=".LoginActivity"
    android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Ecco come dovrebbero apparire i tuoi res / valori / colors.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>

1
Penso che questa sia la soluzione più semplice ma più pulita. Non è necessario avere un livello API minimo di 21 , solo una semplice sostituzione. Merita più voti positivi.
TahinRupam,

Questo non funzionava quando si eseguiva Nougat e il livello di API era impostato su 19. Funzionava se ho impostato android: tema sotto il nodo dell'applicazione nel manifest.
AndroidDev,

18

Per cambiare il colore per lolipop sopra basta aggiungere questo al vostro styles.xml

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

ma ricorda , se vuoi avere un colore chiaro per la barra di stato, aggiungi anche questa linea

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

1
Grazie, è anche una risposta utile.
Andrew Grow

16

È possibile modificare il colore della barra di stato con questa funzione. funziona su Android L significa API 21 e successive e necessita di una stringa di colori come "#ffffff".

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}

15

Avevo questo requisito: cambiare a livello di codice il colore della barra di stato mantenendolo trasparente , per consentire al cassetto di navigazione di disegnarsi sovrapponendosi alla barra di stato trasparente.

Non posso farlo utilizzando l'API

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

Se si seleziona qui in overflow dello stack, tutti prima di quella riga di codice impostano la trasparenza della barra di stato con

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

Sono in grado di gestire il colore e la trasparenza della barra di stato in questo modo:

  • Android 4: non c'è molto che puoi fare, perché non puoi gestire il colore della barra di stato dall'API ... l'unica cosa che puoi fare è impostare la barra di stato come traslucida e spostare un elemento colorato dell'interfaccia utente sotto lo stato bar. Per fare questo devi giocare

    android:fitsSystemWindows="false"

    nel layout principale. Ciò consente di disegnare il layout sotto la barra di stato. Quindi devi giocare con un po 'di imbottitura con la parte superiore del layout principale.

  • Android 5 e versioni successive: devi definire uno stile con

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

    ciò consente al riquadro di navigazione di sovrapporsi alla barra di stato.

    Quindi, per cambiare il colore mantenendo trasparente la barra di stato, è necessario impostare il colore della barra di stato con

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))

    dove drawerLayout è definito in questo modo

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

Ha funzionato per me senza <item name="android:windowDrawsSystemBarBackgrounds">true</item>. Comunque, dopo giorni di ricerca, ho trovato qualcosa che funziona davvero (testato solo su Lolllipop per il momento). Grazie
DenisGL,

stavo avendo lo stesso problema e la tua risposta mi ha aiutato a risolverlo.
A.Gun

7

Modifica colorPrimary in colors.xml in Valori con il colore che desideri sia nella barra di stato. Per esempio:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>


7

Per cambiare il colore della barra di stato vai a res/values-v21/styles.xmle il colore della barra di stato

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">#0000FF</item>
    </style>
</resources>

Ehi, potresti aiutarmi? Non ho idea di Android e non posso iniziare ad imparare ora. Ho una semplice app che esegue un file html. Sto morendo dalla voglia di cambiare il colore della barra di stato perché quella in alto e in basso su # 000 è orribile per il mio palato. Ma proprio non riesco, non riesco nemmeno a trovare il file styles.xml ... Se potessi inviarti il ​​mio apk e me lo avessi impostato, ti sarei grato!
Thiago Soubra,

6

Se si desidera modificare il colore della barra di stato a livello di codice (e purché il dispositivo disponga di Android 5.0). Questo è un modo semplice per cambiare statusBarColor da qualsiasi attività e metodi molto semplici quando frammenti diversi hanno colore della barra di stato diverso.

 /**
 * @param colorId id of color
 * @param isStatusBarFontDark Light or Dark color
 */
fun updateStatusBarColor(@ColorRes colorId: Int, isStatusBarFontDark: Boolean = true) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.statusBarColor = ContextCompat.getColor(this, colorId)
        setSystemBarTheme(isStatusBarFontDark)
    }
}

/** Changes the System Bar Theme.  */
@RequiresApi(api = Build.VERSION_CODES.M)
private fun setSystemBarTheme(isStatusBarFontDark: Boolean) {
    // Fetch the current flags.
    val lFlags = window.decorView.systemUiVisibility
    // Update the SystemUiVisibility depending on whether we want a Light or Dark theme.
    window.decorView.systemUiVisibility = if (isStatusBarFontDark) lFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() else lFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}

5

Se vuoi lavorare su Android 4.4 e versioni successive, prova questo. Mi riferisco alla risposta di Harpreet e a questo link. Android e la barra di stato trasparente

Innanzitutto, chiama il metodo setStatusBarColored nel metodo onCreate di Activity (l'ho inserito in una classe util). Uso un'immagine qui, puoi cambiarla per usare un colore.

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Prima: prima

Dopo: dopo

Il colore della barra di stato è stato modificato, ma la barra delle navi è tagliata, quindi è necessario impostare il margine o l'offset della barra delle navi nel metodo onCreate.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }

Quindi la barra di stato sarà simile a questa.

barra di stato


4

Questo è ciò che ha funzionato per me in KitKat e con buoni risultati.

public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }

2

Un'altra soluzione:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);

Funzionerà su tablet con la barra di stato nella parte inferiore dello schermo?
guy.gc

6
cos'è "w" e "UiUtil" qui?
Manav Patadia,

2

cambia colorPrimaryDark nel colore desiderato nel file res / valori / styles.xml

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>
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.