¿Cómo cambiar el color de la barra de estado en Android?

427

En primer lugar, no es un duplicado como en Cómo cambiar el color de fondo de la barra de estado de Android

¿Cómo cambio el color de la barra de estado, que debería ser el mismo que en la barra de navegación?

Quiero que el color de la barra de estado sea el mismo que el color de la barra de navegación

ingrese la descripción de la imagen aquí

codercat
fuente
2
es posible solo después de kitkat @MarkBuikema
codercat
44
Como sugiere Niels, hay un ATRIBUTO DE TEMA desde que se llamó v21 android:statusBarColor. Simplemente puede agregarlo a values-v21/styles.xml.
Levite
@MarkBuikema ¿Cómo se relaciona eso con el acceso a la raíz?
Steve Moretz

Respuestas:

625

Android 5.0 Lollipop introdujo el tema Material Design que colorea automáticamente la barra de estado según el colorPrimaryDarkvalor del tema.

Esto es compatible con el dispositivo pre-lollipop gracias a la biblioteca support-v7-appcompat a partir de la versión 21. Blogpost sobre el soporte appcompat v21 de Chris Banes

ingrese la descripción de la imagen aquí

Lea más sobre el tema Material en el sitio web oficial de desarrolladores de Android

Giorgio
fuente
29
en alguna razón, el atributo colorPrimaryDark no funciona para mí. Probado en el emulador v21
desviado
3
Funciona, tienes que ver los cambios en el emulador, no en la vista previa del diseño [no se muestra allí]
Mightian
66
colorPrimaryDark tampoco me funciona en un emulador API 18. Del artículo vinculado sobre appcompat: "En plataformas más antiguas, AppCompat emula la temática del color siempre que sea posible. Por el momento, esto se limita a colorear la barra de acción y algunos widgets".
Adam Johns
12
¿Qué pasa con el cambio del color de fuente en la barra de estado? Los documentos no dicen nada al respecto.
Scott Biggs
Lo intenté de la misma manera. funciona perfectamente en la mayoría de todos los dispositivos, pero tengo el Samsung Galaxy S4 con OS 5.0.1 y en este color de la barra de estado del teléfono es negro. Y una vez que voy a otra actividad y vuelvo a la actividad anterior, el color de mi barra de estado cambia al color del tema de la aplicación. Cualquier razón por la que esto está sucediendo
Hitesh Kamani
364

Actualizar:

Pirulí:

public abstract void setStatusBarColor (int color)

Agregado en API nivel 21

Android Lollipop trajo consigo la capacidad de cambiar el color de la barra de estado en su aplicación para una experiencia de usuario más inmersiva y en sintonía con la de Google Material Design Guidelines.

Aquí es cómo puede cambiar el color de la barra de estado utilizando el nuevo window.setStatusBarColormétodo introducido en API level 21.

Cambiar el color de la barra de estado también requiere configurar dos banderas adicionales en la Ventana; necesita agregar la FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSbandera y borrar la FLAG_TRANSLUCENT_STATUSbandera.

Código de trabajo

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

Referencia del desarrollador oficial: setStatusBarColor (int)

Ejemplo: diseño de materiales en todas partes

Chris Banes Blog- appcompat v21: ¡diseño de material para dispositivos pre-Lollipop!

ingrese la descripción de la imagen aquí

El transitionNamefondo para la vista será android:status:background.

codercat
fuente
2
¿Alguna solución para la compatibilidad con versiones anteriores?
Adam Hurwitz
Como se señaló en la respuesta de Niels: también puede configurar el color de la barra de estado a través del tema / estilo configurando android:statusBarColoren su values-v21/styles.xmlarchivo por androiddocs.com/training/material/theme.html así<item name="android:statusBarColor">@color/primary_color</item>
JL West
44
Puedo cambiar el color de la barra de estado a blanco, pero no puedo ver el icono de notificación como batería, ¿cómo puedo resolver esto?
MNFS
1
no tienes idea de cuánto me ayudaste ...
Abhishek Dhyani
223

Coloque estos son sus valores-v21 / styles.xml, para habilitar esto en 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>
Niels
fuente
34
esto requiere un mínimo de API 21
Romano
50
Esta es probablemente la razón por la que sugirió ponerlo en valores-v21 / styles.xml ;-) ¡Parece ser la respuesta más precisa hasta ahora!
Levite
¡Pero esto todavía marca una advertencia!
Nihal Sharma
¿Cuál es la función para compat? barra de estado
blackHawk
puede agregar un targeApiatributo si desea mantener un único archivo de estilo. Lea mi respuesta como referencia stackoverflow.com/a/48565459/4291272
Faisal Shaikh
50

esta es una manera muy fácil de hacer esto sin ninguna biblioteca: si la versión del sistema operativo no es compatible, en kitkat, entonces no pasa nada. hago estos pasos:

  1. en mi xml agregué al principio esta Vista:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

entonces hice este método:

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

También necesita estos dos métodos para obtener la barra de acción y la altura de la barra de estado:

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

entonces lo único que necesita es esta línea para configurar el color de la barra de estado:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
itzhar
fuente
1
¿Dónde debo poner el elemento de vista? ¿Debería estar encima del diseño principal?
Emil Reña Enriquez
Si. En tu xml. En lo más alto.
itzhar
Precaución: funciona solo para Android> = 19 API. En mi caso, necesito apoyo a partir de 16
Anton Kizema
setStatusBarColor (findViewById (android.R.id.statusBarBackground), getResources (). getColor (android.R.color.white));
AndroidLad
34

Como @Niels dijo que debe colocar en valores-v21 / styles.xml:

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

Pero agregue tools:targetApi="lollipop"si desea estilos individuales.xml, como:

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>
Faisal Shaikh
fuente
3
Muchas gracias por "targetApi". No me gusta que mi tema se distribuya en varios archivos. :)
plexo
31

Bueno, la solución de Izhar estaba bien, pero, personalmente, estoy tratando de evitar el código que se ve así:

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

Además, tampoco me gusta duplicar el código. En su respuesta, debo agregar dicha línea de código en todas las Actividades:

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

Entonces, tomé la solución Izhar y usé XML para obtener el mismo resultado: crear un diseño para 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">

Observe los atributos de altura y elevación, estos se establecerán en valores, valores-v19, valores-v21 más abajo.

Agregue este diseño al diseño de sus actividades utilizando 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>

Para la barra de herramientas, agregue el atributo de margen superior:

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

En su appTheme style-v19.xml y styles-v21.xml, agregue el atributo windowTranslucent:

styles-v19.xml, v21:

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

Y finalmente, en sus dimens, dimens-v19, dimens-v21, agregue los valores para la barra de herramientas topMargin y la altura del statusBarHeight: dimens.xml por menos que KitKat:

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

La altura de la barra de estado es siempre 24dp dimens-v19.xml para KitKat y superior:

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

dimens-v21.xml para Lolipop, solo agregue la elevación si es necesario:

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

Este es el resultado de Jellybean KitKat y Lollipop:

ingrese la descripción de la imagen aquí

Moti Bartov
fuente
Entonces, en lugar de poner el código de verificación, lo has puesto en XML. Su solución funcionará en Kitkat, al igual que lo que obtuvo.
Desarrollador de Android
26

Puedes usar este código simple:

One-liner en Kotlin:

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

Respuesta original con Java y verificación de versión manual:

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));
}
Steve Moretz
fuente
Puede simplificar aún más esto usando ContextCompat. En Kotlin, entonces es solo esto:window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
Sunadorer
Cuando lo escribí no había probado kotlin. ¿Por qué no editas la respuesta y puedo aprobarla? :)
Steve Moretz
Buena idea. He incluido mi sugerencia en la respuesta como una referencia fácil para futuros visitantes
sunadorer
el color de la barra de estado cambió por encima de Build.VERSION_CODES.M. no funciona debajo de Lollipop
Muhammed Haris
@ MuhammedHaris funciona. ¿Usaste el código kotlin o java?
Steve Moretz
23

Simplemente cree un nuevo tema en res / values ​​/ styles.xml donde cambie el "colorPrimaryDark", que es el color de la barra de estado:

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

Y modifique el tema de la actividad en AndroidManifest.xml al que desee, en la siguiente actividad puede volver a cambiar el color al original seleccionando el tema original:

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

Así es como deberían verse sus res / values ​​/ 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>
lcompare
fuente
1
Creo que esta es la solución más simple pero más limpia. No es necesario tener un nivel mínimo de API de 21 , solo una anulación simple. Merece más votos positivos.
tahsinRupam
Esto no funcionó cuando se ejecutó en Nougat y el nivel de API configurado en 19. Funcionó si configuro android: theme en el nodo de la aplicación en el manifiesto.
AndroidDev
18

Para cambiar el color de lolipop anterior simplemente agregue esto a sus styles.xml

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

pero recuerde , si desea tener un color claro para la barra de estado, agregue esta línea también

<item name="android:windowLightStatusBar">true</item>
Amin Keshavarzian
fuente
1
Gracias, también es una respuesta útil.
Andrew Grow
16

Puede cambiar el color de la barra de estado con esta función. funciona en Android L significa API 21 y superior y necesita una cadena de color como "#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));
    }
}
sajad abbasi
fuente
15

Tenía este requisito: cambiar programáticamente el color de la barra de estado manteniéndolo transparente , para permitir que el cajón de navegación se dibuje solapando la barra de estado transparente .

No puedo hacer eso usando la API

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

Si marca aquí en desbordamiento de pila todos antes de esa línea de código, establezca la transparencia de la barra de estado en sólida con

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

Puedo administrar el color y la transparencia de la barra de estado de esta manera:

  • Android 4: no hay mucho que puedas hacer, porque no puedes administrar el color de la barra de estado desde la API ... lo único que puedes hacer es configurar la barra de estado como translúcida y mover un elemento coloreado de tu IU debajo del estado bar. Para hacer esto necesitas jugar con

    android:fitsSystemWindows="false"

    en tu diseño principal. Esto le permite dibujar su diseño bajo la barra de estado. Luego debes jugar con algo de relleno con la parte superior de tu diseño principal.

  • Android 5 y superior: debes definir un estilo con

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

    Esto permite que el cajón de navegación se superponga con la barra de estado.

    Luego, para cambiar el color manteniendo la barra de estado transparente, debe establecer el color de la barra de estado con

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

    donde drawerLayout se define así

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
DSoldo
fuente
Funcionó para mí sin <item name="android:windowDrawsSystemBarBackgrounds">true</item>. De todos modos, después de días de búsqueda, encontré algo que realmente funciona (probado solo en Lolllipop por el momento). Gracias
DenisGL
Estaba teniendo el mismo problema y su respuesta me ayudó a resolver esto.
A.Gun
7

Edite el colorPrimary en colors.xml en Valores al color que desea que tenga la Barra de estado. Por ejemplo:

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

PhilipS
fuente
7

Para cambiar el color de la barra de estado, vaya a res/values-v21/styles.xmly color de la barra de estado

<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>
poder radhason
fuente
Oye, ¿podrías ayudarme? No tengo idea de Android y no puedo comenzar a aprender ahora. Tengo una aplicación simple que ejecuta un archivo html. Me muero por cambiar el color de la barra de estado porque esa parte superior e inferior en # 000 es horrible para mi paleta. Pero simplemente no puedo, ni siquiera puedo encontrar el archivo styles.xml ... ¡Si pudiera enviarle mi apk y me lo estableciera, lo agradecería muchísimo!
Thiago Soubra
6

Si desea cambiar el color de la barra de estado mediante programación (y siempre que el dispositivo tenga Android 5.0). Esta es una manera simple de cambiar statusBarColor desde cualquier actividad y métodos muy fáciles cuando diferentes fragmentos tienen un color de barra de estado diferente.

 /**
 * @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
}
Nabin
fuente
5

Si desea trabajar en Android 4.4 y superior, intente esto. Me refiero a la respuesta de Harpreet y este enlace. Android y la barra de estado transparente

Primero, llame al método setStatusBarColored en el método onCreate de Activity (lo puse en una clase util). Utilizo una imagen aquí, puedes cambiarla para usar un color.

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

Antes de: antes de

Después: después

El color de la barra de estado ha cambiado, pero la barra de navegación está cortada, por lo que debemos establecer el margen o el desplazamiento de la barra de navegación en el método 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);
    }

Entonces la barra de estado se verá así.

barra de estado

Alano
fuente
4

Esto es lo que funcionó para mí en KitKat y con buenos resultados.

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));
        }
    }
Harpreet
fuente
2

Una solución mas:

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);
Vova K.
fuente
¿Funcionará esto en tabletas donde la barra de estado está en la parte inferior de la pantalla?
guy.gc
66
¿Qué es 'w' y 'UiUtil' aquí?
Manav Patadia
2

cambie el colorPrimaryDark a su color deseado en el archivo res / values ​​/ 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>
Engr Syed Rowshan Ali
fuente