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
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
Lea más sobre el Tema Material en el sitio web oficial de desarrolladores de Android
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!
El transitionName
para el fondo de la vista será android:status:background
.
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>
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:
- 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));
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:
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>
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">
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>
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));
}
}
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;
}
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í.
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));
}
}
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);
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>
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