para - Cómo cambiar el color de la barra de estado en Android
como cambiar el color de la barra de notificaciones moto g (13)
Actualizar:
Pirulí:
public abstract void setStatusBarColor (int color)
Añadido en el nivel API 21
Android Lollipop trajo consigo la posibilidad 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í es cómo puede cambiar el color de la barra de estado usando el nuevo método window.setStatusBarColor
introducido en el API level 21
.
Cambiar el color de la barra de estado también requiere configurar 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 material para dispositivos pre-Lollipop!
El nombre de transitionName
para el fondo de la vista será android:status:background
.
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
Android 5.0 Lollipop introdujo el tema Material Design, que colorea automáticamente la barra de estado según el 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 support appcompat v21 de Chris Banes
Lea más sobre el tema del material en el sitio web oficial de desarrolladores de Android
Bueno, la solución de Izhar estuvo 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
};
Tampoco me gusta duplicar el código. En su respuesta, tengo que 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 de 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 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 su appTheme style-v19.xml y styles-v21.xml, agregue el windowTranslucent attr:
styles-v19.xml, v21:
<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>
Y finalmente, en su dimens, dimens-v19, dimens-v21, agregue los valores para la Barra de herramientas topMargin y la altura del statusBarHeight: dimens.xml por 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, solo agregue la elevación si es necesario:
<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>
Este es el resultado para Jellybean KitKat y Lollipop:
Coloque este es su 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>
Como @Niels dijo que debes colocar en values-v21 / styles.xml:
<item name="android:statusBarColor">@color/black</item>
Pero agrega tools:targetApi="lollipop"
si quieres solo styles.xml, como:
<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>
Edite colorPrimary en el archivo colors.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>
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));
}
}
Puedes 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));
}
}
Si quieres trabajar en Android 4.4 y superior, prueba 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). 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;
}
Se ha cambiado el color de la barra de estado, pero la barra de navegación se recorta, 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í.
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 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ía verse 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>
Tenía este requisito: cambiar mediante programación el color de la barra de estado manteniéndolo transparente , para permitir que el Cajón de navegación se dibuje solapándose sobre 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 el desbordamiento de pila, antes de esa línea de código, establezca la transparencia de la barra de estado como sólida.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
Soy capaz de 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 de color de tu interfaz de usuario debajo del estado bar. Para ello necesitas jugar con
android:fitsSystemWindows="false"
en su diseño principal. Esto le permite dibujar su diseño debajo de la barra de estado. Entonces necesitas jugar con un poco de relleno con la parte superior de tu diseño principal.
Android 5 y superior: 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 configurar el color de la barra de estado con
drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))
donde drawerLayout se define como este
<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true">
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);
esta es una forma muy fácil de hacer esto sin ninguna biblioteca: si la versión del sistema operativo no es compatible, bajo kitkat, no pasa nada. hago estos pasos:
- en mi xml he añadido a la parte superior de 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 necesitas 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 configurar el color de la barra de estado:
setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));