Cambia il colore della barra di stato con AppCompat ActionBarActivity


146

In una delle mie attività, ho cambiato il colore della barra degli strumenti usando Palette. Ma su dispositivi 5.0 che usano ActionBarActivityil status barcolore è il mio colore colorPrimaryDarknel mio tema di attività, quindi ho 2 colori molto diversi e non ha un bell'aspetto.

Mi rendo conto che in 5.0 puoi usare Window.setStatusBarColor()ma ActionBarActivitynon ce l'hai.

quindi la mia domanda è in 5.0 come posso cambiare il colore della barra di stato con ActionBarActivity?


Hai provato ad usare la libreria SystemBarTint? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

Risposte:


420

Non sono sicuro di aver capito il problema.

Voglio cambiare il colore della barra di stato a livello di codice (e purché il dispositivo abbia Android 5.0), quindi puoi usarlo Window.setStatusBarColor(). Non dovrebbe fare alcuna differenza se l'attività è derivata da Activityo ActionBarActivity.

Prova a fare:

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

Ho appena provato questo ActionBarActivitye funziona bene.


Nota: l'impostazione del FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSflag a livello di values-v21codice non è necessaria se il file degli stili è già impostato, tramite:

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

1
ah ok non stavo usandogetWindow()
tyczj il

questo si bloccherebbe quando il codice LOLLIPOP non viene trovato nei vecchi androidi. è meglio usare> = 21
code511788465541441

12
@ code578841441 In realtà, ciò non dovrebbe accadere. Le costanti sono incorporate durante la compilazione.
matiash,

4
@ code578841441: questo perché si sta compilando con un SDK più vecchio. Dovresti sempre cercare di compilare con l'ultimo Android SDK, anche se hai vincoli di versione API precedenti (cioè minSdkVersione / o targetSdkVersionattributi <uses-sdk ...>sull'elemento).
dbm

3
Ho anche dovuto chiamare getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); per farlo funzionare
Philipp E.

61

Esistono vari modi per modificare il colore della barra di stato.

1) Utilizzo di styles.xml. Puoi usare l'attributo android: statusBarColor per farlo in modo semplice ma statico.

Nota: è inoltre possibile utilizzare questo attributo con il tema Materiale.

<?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) Puoi farlo dinamicamente usando il metodo setStatusBarColor (int) nella classe Window. Ma ricorda che questo metodo è disponibile solo per API 21 o successiva. Quindi assicurati di controllarlo, o la tua app si bloccherà sicuramente nei dispositivi inferiori.

Ecco un esempio funzionante di questo metodo.

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

dove primaryDark è la 700 tinta del colore primario che sto usando nella mia app. È possibile definire questo colore nel file colors.xml.

Provalo e fammi sapere se hai qualche domanda. Spero che sia d'aiuto.


sembra window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); non è necessario - ma questo ha funzionato per me
bkurzius,

Qualche idea sul perché la versione programmatica dovrebbe funzionare ma la versione in stile no?
Andrew,

Nel mio caso lo stile dell'attività aveva il flah translucent_status impostato, quindi senza il comando window.clearFlags non funzionava. Quindi grazie per questo!
BMacedo,

Oh wow! Questa dovrebbe essere una risposta accettata, aggiungere la clearFlagscorrezione del mio problema
fanjavaid,

9

Non credo che il colore della barra di stato sia stato ancora implementato in AppCompat. Questi sono gli attributi disponibili:

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

(Da \ sdk \ extra \ android \ support \ v7 \ appcompat \ res \ valori \ attrs.xml )


1
È possibile che non verrà mai implementato in AppCompat se le versioni precedenti del sistema operativo non offrono alcuna possibilità di modificare la barra di stato.
TheIT

2
<attr name = "colorPrimaryDark" format = "color" /> <! - Variante scura del colore del marchio principale. Per impostazione predefinita, questo è il colore applicato alla barra di stato (tramite statusBarColor) e alla barra di navigazione (tramite navigationBarColor). ->
Soheil Setayeshi il

3

Prova questo, l'ho usato e funziona molto bene con la v21.

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

1

Grazie per le risposte sopra, con l'aiuto di quelle, dopo una certa ricerca e sviluppo per l'applicazione MVVMCross xamarin.android, sotto ha funzionato

Flag specificato per l'attività nel metodo OnCreate

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

Per ogni MvxActivity, il tema è menzionato di seguito

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

Il mio SplashStyle.xml si presenta come di seguito

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

E ho fatto riferimento all'app V7.


1

[Versione Kotlin] Ho creato questa estensione che controlla anche se il colore desiderato ha abbastanza contrasto per nascondere l'interfaccia utente del sistema, come l'icona dello stato della batteria, l'orologio, ecc., Quindi impostiamo l'interfaccia utente del sistema bianca o nera in base a questo.

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

applicando

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

in Theme.AppCompat.Light.DarkActionBarnon ha funzionato per me. Qual è stato il trucco, dando colorPrimaryDarkcome al solito insieme android:colorPrimarya styles.xml

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

e nell'ambientazione

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

non è stato necessario impostare il colore della barra di stato nel codice.

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.