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

enter image description here

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

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

enter image description here

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

Actualizar:

Chupete:

 public abstract void setStatusBarColor (int color) 

Agregado en el nivel 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 las Material Design Guidelines de Google.

Aquí puede cambiar el color de la barra de estado utilizando el nuevo método window.setStatusBarColor introducido en el API level 21 .

Cambiar el color de la barra de estado también requiere establecer dos banderas adicionales en la ventana; debe agregar el indicador FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS y borrar el indicador 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 de desarrollador oficial: setStatusBarColor (int)

Ejemplo: material-design-everywhere

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

enter image description here

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

Coloque este es su valor-v21 / styles.xml, para habilitar esto en Lollipop:

     

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 pasó nada. hago estos pasos:

  1. en mi xml agregué a la parte superior esta Vista:
  

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 esos 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 establecer el color de la barra de estado:

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

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, tengo que agregar esa 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 utilicé XML para obtener el mismo resultado: crear un diseño para StatusBar status_bar.xml

  

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:

    //The rest of your layout  

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

  

En su aplicación Theme style-v19.xml y styles-v21.xml, agregue el atributo windowTranslucent attr:

styles-v19.xml, v21:

  true  

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

  4dp 0dp 0dp  

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

  24dp 24dp  

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

  4dp  

Este es el resultado de Jellybean KitKat y Lollipop:

enter image description here

Simplemente crea un nuevo tema en res / values ​​/ styles.xml donde cambias el “colorPrimaryDark” que es el color de la barra de estado:

  

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

       

Así es como debería ser tu res / values ​​/ colors.xml :

   #3F51B5 #303F9F #c6d6f0 #757575  

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 stack, todos los que están antes de esa línea de código configuran la transparencia de la barra de estado como 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 pueda hacer, porque no puede administrar el color de la barra de estado desde la API … lo único que puede hacer es configurar la barra de estado como translúcida y mover un elemento coloreado de su UI bajo el estado bar. Para hacer esto, necesitas jugar con

     android:fitsSystemWindows="false" 

    en tu diseño principal Esto le permite dibujar su diseño debajo de la barra de estado. Entonces necesitas jugar con algo de relleno con la parte superior de tu diseño principal.

  • Android 5 y superior: debes definir un estilo con

     true @android:color/transparent 

    esto permite que el cajón de navegación se superponga a la barra de estado.

    Luego, para cambiar el color y mantener 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í

      

Como @Niels dijo que debes colocar en values-v21 / styles.xml:

 @color/black 

Pero agregue tools:targetApi="lollipop" si quiere solo styles.xml, como:

 @color/black 

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

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

Si quieres trabajar con Android 4.4 o 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). 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

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