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


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

introduzca la descripción de la imagen aquí

Author: Community, 2014-03-05

13 answers

Android 5.0 Lollipop introdujo el tema Material Design que colorea automáticamente la barra de estado en función del valor colorPrimaryDark 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

introduzca la descripción de la imagen aquí

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

 442
Author: Giorgio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-10 07:04:02

Actualización:

Piruleta:

public abstract void setStatusBarColor (int color)

Añadido en el nivel de API 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 Google Material Design Guidelines.

Así es como puede cambiar el color de la barra de estado usando el nuevo método window.setStatusBarColor introducido en API level 21.

Cambiar el color de la barra de estado también requiere establecer dos banderas adicionales en la ventana; debe agregar la bandera FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS y desactive la bandera FLAG_TRANSLUCENT_STATUS.

Código de trabajo:

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 oficial del desarrollador: setStatusBarColor (int)

Ejemplo: material-design-everywhere

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

introduzca la descripción de la imagen aquí

El transitionName para el fondo de la vista será android:status:background.

 265
Author: codercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-15 11:33:23

Place 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>
 151
Author: Niels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-14 10:20:11

Esta es una manera muy fácil de hacer esto sin ninguna biblioteca: si la versión del sistema operativo no es compatible - bajo kitkat-por lo que no pasó nada. hago estos pasos:

  1. en mi xml agregué a la parte superior 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 ambos métodos para obtener la altura de la barra de acciones y 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 establecer el color de la barra de estado:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
 46
Author: itzhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-06 12:37:26

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 código. En su respuesta tengo que añadir 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 de Izhar y usé XML para obtener el mismo resultado: Cree un diseño para la barra de estado 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 a su diseño de actividades 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>

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 tu estilo AppTheme-v19.xml y estilos-v21.xml, añade el attr de 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 para menos de 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, simplemente agregue la elevación si es necesario:

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

Este es el resultado para Jellybean KitKat y Lollipop:

introduzca la descripción de la imagen aquí

 29
Author: Moti Bartov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-15 18:41:37

Simplemente crea un nuevo tema en res/values/styles.xml donde se cambia el color "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 modificar el tema de actividad en AndroidManifest.xml al que desee, en la siguiente actividad puede 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 tus res/values/colors.xml debería tener el siguiente aspecto:

<?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>
 15
Author: lcompare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-23 11:17:36

Tenía este requisito: Cambiar programáticamente el color de la barra de estado manteniéndola transparente, para permitir que el Cajón de Navegación se dibuje superponiendo 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 stack overflow todos antes de esa línea de código establezca la transparencia de la barra de estado en sólido con

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

Soy capaz de administrar el color y la transparencia de la barra de estado como esto:

  • 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 puede hacer es establecer la barra de estado como translúcida y mover un elemento de color de su interfaz de usuario bajo la barra de estado. Para ello es necesario jugar con

    android:fitsSystemWindows="false"
    

    En su diseño principal. Esto le permite dibujar su diseño debajo de la barra de estado. A continuación, usted necesita para jugar con un poco de relleno con la parte superior de su diseño principal.

  • Android 5 y arriba: tienes que 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 a 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">
    
 9
Author: DSoldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 08:20:05

Como @Niels dijo, tienes que colocar en values-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>
 8
Author: Faisal Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 14:45:39

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));
    }
}
 6
Author: sajad abasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-28 22:55:36

Si quieres trabajar en Android 4.4 y superior, prueba esto. Me refiero a la respuesta de Harpreet y a 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). Yo uso 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: antes

Después: despues

El color de la barra de estado ha cambiado, pero la barra navi está cortada, por lo que necesitamos establezca el margen o desplazamiento de la barra navi 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

 4
Author: Allan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-17 02:15:32

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));
        }
    }
 3
Author: Harpreet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 19:23:20

Una solución más:

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);
 2
Author: Vova K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-27 17:38:50

Edite el colorPrimary en los colores.xml en Valores al color que desea que sea 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>

 1
Author: PhilipS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 10:18:13