Lollipop: dibuja detrás de StatusBar con su color puesto a transparente

He fijado mi color del statusBar a transparente para Lollipop solamente con la línea siguiente en mi tema:

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

Ahora necesito dibujar detrás de él, pero no puedo conseguir ninguna visión dibujar detrás de él. Sé cómo hacerlo con la propiedad windowTranslucentStatus , pero no quiero usar esta propiedad, ya que luego ignorará el color de la statusBar establecido en transparente.

Método 1:

Para lograr una barra de estado completamente transparente, debe utilizar statusBarColor , que sólo está disponible en la API 21 y superiores. windowTranslucentStatus está disponible en API 19 y superior, pero agrega un fondo teñido para la barra de estado. Sin embargo, la configuración de windowTranslucentStatus consigue una cosa que cambiar statusBarColor a transparente no: establece los SYSTEM_UI_FLAG_LAYOUT_STABLE y SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN . La forma más fácil de obtener el mismo efecto es establecer manualmente estos indicadores, lo que efectivamente deshabilita las inserciones impuestas por el sistema de diseño de Android y te deja a ti mismo.

Llamar a esta línea en su método onCreate :

 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 

Asegúrese también de establecer la transparencia en /res/values-v21/styles.xml:

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

O establecer la transparencia mediante programación:

 getWindow().setStatusBarColor(Color.TRANSPARENT); 

Lo bueno de este enfoque es que los mismos diseños y diseños también se pueden usar en API 19 intercambiando la barra de estado transparente para la barra de estado translúcida teñida.

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

Método 2:

Si sólo necesita pintar una imagen de fondo debajo de su barra de estado, en lugar de posicionar una vista detrás de ella, esto puede hacerse simplemente configurando el fondo del tema de su actividad a la imagen deseada y estableciendo la transparencia de la barra de estado como se muestra en el método # 1. Este fue el método que usé para crear las capturas de pantalla para el artículo Android de la policía de hace unos meses.

Método # 3:

Si tienes que ignorar las inserciones estándar del sistema para algunos diseños mientras se mantiene trabajando en otros, la única forma viable de hacerlo es trabajar con la clase ScrimInsetsFrameLayout menudo vinculada. Por supuesto, algunas de las cosas que se hacen en esa clase no son necesarias para todos los escenarios. Por ejemplo, si no planea usar la superposición sintética de la barra de estado, simplemente comente todo en el método init() y no se moleste en agregar nada al archivo attrs.xml. He visto este enfoque trabajar, pero creo que encontrará que trae algunas otras implicaciones que pueden ser un montón de trabajo para moverse.

También vi que te oponías a envolver varios diseños. En el caso de envolver un diseño dentro de otro, donde ambos tienen match_parent para la altura y el ancho, las implicaciones de rendimiento son demasiado triviales para preocuparse. Independientemente, puede evitar esa situación cambiando completamente la clase que se extiende desde FrameLayout a cualquier otro tipo de clase de diseño que desee. Funcionará muy bien.

Esto funciona perfectamente para mí


 // Create/Set toolbar as actionbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // Check if the version of Android is Lollipop or higher if (Build.VERSION.SDK_INT >= 21) { // Set the status bar to dark-semi-transparentish getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Set paddingTop of toolbar to height of status bar. // Fixes statusbar covers toolbar issue toolbar.setPadding(0, getStatusBarHeight(), 0, 0); } 

 // A method to find height of the status bar public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 

Pruebe este tema

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="colorPrimaryDark">@android:color/transparent</item> <item name="colorPrimary">@color/md_blue_200</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowTranslucentStatus">true</item> </style> 

Asegúrese de que su conjunto de diseño

 android:fitsSystemWindows="false" 

En lugar de

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

Utilice lo siguiente:

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

Y asegúrese de quitar el relleno superior (que se agrega de forma predeterminada) en el diseño de "MainActivity".

Tenga en cuenta que esto no hace que la barra de estado sea totalmente transparente, y seguirá habiendo una superposición "negro desvanecido" sobre su barra de estado.

La solución de Cody Toombs casi me hizo el truco. No estoy seguro de si esto está relacionado con Xamarin o no, pero ahora tengo una solución aceptable:

Ejemplo

Esta es mi configuración:

Tengo un proyecto de Android en el que he hecho referencia a los paquetes de Android.Support v4 y v7. Tengo dos estilos definidos:

Values ​​/ styles.xml:

 <?xml version="1.0" encoding="UTF-8" ?> <resources> <style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowTranslucentStatus">true</item> </style> </resources> 

Values-v21 / styles.xml:

 <?xml version="1.0" encoding="UTF-8" ?> <resources> <style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:statusBarColor">@android:color/transparent</item> </style> </resources> 

AndroidManifest apunta a "MyStyle":

AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test"> <uses-sdk android:minSdkVersion="10" /> <application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle"> </application> </manifest> 

Y finalmente el código en la actividad principal:

 [Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity { protected override void OnCreate (Bundle savedInstanceState) { base.OnCreate (savedInstanceState); SetContentView (Resource.Layout.Main); //Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay. var uiOptions = (int)Window.DecorView.SystemUiVisibility; uiOptions ^= (int)SystemUiFlags.LayoutStable; uiOptions ^= (int)SystemUiFlags.LayoutFullscreen; Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions; Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); } } 

Tenga en cuenta que establecer DrawsSystemBarBackgrounds bandera, esto hace que toda la diferencia

 Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); 

Pasé mucho tiempo haciéndolo bien, demasiado tiempo de hecho. Esperemos que esta respuesta ayude a cualquiera que intente lograr lo mismo.

Al igual que algunas de las soluciones publicadas, pero en mi caso hice la barra de estado transparente y fijar la posición de la barra de acción con un margen negativo

 if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor(Color.TRANSPARENT); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams(); lp.setMargins(0, -getStatusBarHeight(), 0, 0); } 

Y lo usé en la barra de herramientas y la vista de raíz

 android:fitsSystemWindows="true" 

Puede utilizar ScrimInsetFrameLayout

https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java

Android: fitsSystemWindows = "true" debe establecerse en el diseño de malla!

Tuve el mismo problema así que crear ImageView que dibujar detrás de la barra de estado API 19+

Establecer imagen personalizada detrás de Barra de estado gist.github.com

 public static void setTransparent(Activity activity, int imageRes) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return; } // set flags if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } else { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } // get root content of system window //ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); // rootView.setFitsSystemWindows(true); // rootView.setClipToPadding(true); ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (contentView.getChildCount() > 1) { contentView.removeViewAt(1); } // get status bar height int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android"); int height = 0; if (res != 0) height = activity.getResources().getDimensionPixelSize(res); // create new imageview and set resource id ImageView image = new ImageView(activity); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); image.setLayoutParams(params); image.setImageResource(imageRes); image.setScaleType(ScaleType.MATRIX); // add image view to content view contentView.addView(image); // rootView.setFitsSystemWindows(true); } 

Con Android Studio 1.4, el proyecto de plantilla con el código de placa de la caldera establece el tema de Overlay en tu AppbarLayout y / o Toolbar. También se configuran para que se fitSystemWindow detrás de la barra de estado mediante el atributo fitSystemWindow = true. Esto hará que sólo barra de herramientas se representen directamente debajo de la barra de estado y todo lo demás se renderizará debajo de la barra de herramientas. Por lo tanto, las soluciones proporcionadas anteriormente no funcionarán por sí solas. Tendrá que realizar los cambios siguientes.

  • Quite el tema Superposición o cámbielo a un tema sin superposición para la barra de herramientas.
  • Ponga el código siguiente en su archivo styles-21.xml .

    @android: color / transparente

  • Asigne este tema a la actividad que contiene el cajón de navegación en el archivo AndroidManifest.xml .

Esto hará que el cajón de navegación quede detrás de la barra de estado transparente.

Aquí está el tema que utilizo para lograr esto:

 <style name="AppTheme" parent="@android:style/Theme.NoTitleBar"> <!-- Default Background Screen --> <item name="android:background">@color/default_blue</item> <item name="android:windowTranslucentStatus">true</item> </style> 

La solución correcta es cambiar una propiedad en XML bajo su etiqueta de actividad por debajo del estilo. Simplemente funciona

  android:theme="@style/Theme.AppCompat.Light.NoActionBar" 
  • android - UI como deslizamiento hacia abajo barra de notificación
  • ¿Qué componente de visualización utiliza Google Plus App (Stream)?
  • ViewPager no desliza con FragmentPagerAdapter
  • Algo como Twitter Bootstrap para Android?
  • Cuándo utilizar res / xml vs.res / carpetas de diseño en Android
  • Estilo de elemento de menú Arc como en la aplicación tumblr para Android
  • Obtener / recoger una imagen de la aplicación de Android integrada en la Galería mediante programación
  • Java.lang.IllegalStateException: ScrollView puede alojar sólo un hijo directo
  • Android - ScrollView como foursquare con mapas + lista
  • Eliminar el indicador de la serie / la leyenda del diagrama AndroidPlot
  • Cómo probar la aplicación empresarial android en varios dispositivos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.