¿Cómo cambiar el color de la barra de estado para que coincida con la aplicación en Lollipop? [Androide]

96

En la nueva actualización de piruletas, noté que con las aplicaciones nativas de Google, el color de la barra de estado cambia para coincidir con la barra de acción de la aplicación que estás ejecutando. Veo que también está en la aplicación de Twitter, así que supongo que no es exclusivamente Google quien puede hacerlo.

¿Alguien sabe cómo hacer esto si es posible?

Briscoooe
fuente

Respuestas:

220

Para cambiar el color de la barra de estado, use setStatusBarColor (int color) . De acuerdo con el javadoc, también necesitamos establecer algunas banderas en la ventana.

Fragmento de código de trabajo:

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


Tenga en cuenta que el color de la barra de estado y el color de la barra de acción de acuerdo con las pautas de Material Design deben ser diferentes:

  • ActionBar debe usar color primario 500
  • StatusBar debe usar color primario 700

Mira la captura de pantalla a continuación:

ingrese la descripción de la imagen aquí

klimat
fuente
4
Tenga en cuenta que es posible que el efecto no se muestre en el emulador. Por ejemplo, este proyecto de muestra tiñe la barra de estado en un Nexus 9 pero no en un emulador de Android 5.0.
CommonsWare
1
@mate: Me refería al emulador de Android SDK. Es bueno saber que está funcionando en Genymotion.
CommonsWare
3
@Azad No, no es así. Para utilizar el fragmento de código anterior, debe asegurarse de que su dispositivo se ejecute en API 21 o superior.
klimat
1
Estoy trabajando en un proyecto relativamente simple y debo decir que lo acabo de usar getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));y funcionó perfectamente. No estoy seguro del contexto en el que las banderas son estrictamente necesarias.
Joaquin Iurchuk
3
También quiero mostrar el color en dispositivos pre-piruletas. ¿Cómo puede hacerse esto?
WISHY
48

Solo agregue esto en su styles.xml. ColorPrimary es para la barra de acción y colorPrimaryDark es para la barra de estado.

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

Esta imagen del desarrollador Android explica más sobre la paleta de colores. Puedes leer más en este enlace .

ingrese la descripción de la imagen aquí

Gjoko Bozinov
fuente
Android Studio crea las siguientes entradas para cada proyecto: <color name="colorPrimary">#somecolor</color>y <color name="colorPrimaryDark">#somecolor</color>. Se pueden cambiar para lograr el efecto deseado.
Neurotransmisor
41

Otra forma de establecer el color de la barra de estado es mediante style.xml .

Para hacer eso, cree un archivo style.xml en la carpeta res / values-v21 con este contenido:

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

Editar: como se señaló en los comentarios, cuando se usa AppCompat, el código es diferente. En el archivo res / values ​​/ style.xml use en su lugar:

<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
fuente
1
Hizo que. Pero no funcionó. Pero luego uso AppCompat en lugar de Material.
Martin
3
@Martin Para appcompat, use colorPrimaryDark sin el prefijo de Android.
Michiel
no funciona también para appcompat (probado en el nivel 18)
Mohammad Zekrallah
El color de la barra de estado solo funcionará en dispositivos con OS API Nivel 21 y superior. Además, en su manifiesto, asegúrese de no anular este estilo en actividades individuales.
Levon
para inappbrowser cómo cambiar el color de la barra de búsqueda igual que el color de la aplicación
R.Anandan
23

Para establecer el color de la barra de estado, cree un archivo style.xml en la carpeta res / values-v21 con este contenido:

<?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
fuente
dice que no se puede resolver el símbolo windowDrawsSystemBarBackgrounds
jmhostalet
4

Agregue esta línea en el estilo de v21 si usa dos estilos.

  <item name="android:statusBarColor">#43434f</item>
Amit Walke
fuente
Esto no funciona sin establecer la banderaandroid:windowDrawsSystemBarBackgrounds
Eslavo
4

Además, si desea un status-barcolor diferente para diferentes actividades ( fragmentos ), puede hacerlo con los siguientes pasos (trabajar en API 21 y superior):

Primero crea values21/style.xmly coloca el siguiente código:

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

Luego, defina los temas Blanco | Oscuro de la values/style.xmlsiguiente manera:

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

Además, no olvide aplicar temas en su manifest.xml .

Amir
fuente
2

En dispositivos Android anteriores a Lollipop, puede hacerlo desde SystemBarTintManager. Si está usando Android Studio, simplemente agregue Systembartint lib en su archivo gradle.

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

Luego en tu actividad

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