La barra de estado se vuelve blanca y no muestra contenido detrás de ella

96

Estoy probando AppCompat en Marshmallow. Y quiero tener una barra de estado transparente, pero se vuelve blanca. Probé un par de soluciones pero no funcionaron para mí (la barra de estado transparente no funciona con windowTranslucentNavigation = "false" , Lollipop: dibuja detrás de statusBar con su color establecido en transparente ). Aquí está el código relacionado.

Mis estilos.xml

<style name="Bacon" parent="Theme.Bacon"/>

<style name="Theme.Bacon" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@color/background_material_light</item>  
</style>

<style name="Theme.Bacon.Detail" parent="Bacon"/>

v21

<style name="Bacon" parent="Theme.Bacon">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

<style name="Theme.Bacon.Detail" parent="Bacon">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Actividad

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

</FrameLayout>

Fragmento

<android.support.design.widget.CoordinatorLayout 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="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="32dp"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/black_trans80">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/photo"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/anim_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

ingrese la descripción de la imagen aquí

pt2121
fuente
¿Puede resolver este problema? Tengo el mismo problema. En una de mis actividades con barra de estado blanca
kirtan403
1
@ kirtan403 Solucioné mi problema cambiando el diseño de mi actividad de FrameLayout a RelativeLayout. Por favor vea mi respuesta.
pt2121
El mío es relativo, pero sigue teniendo la barra de estado blanca. He publicado una pregunta aquí: stackoverflow.com/q/33890066/1820644
kirtan403
Después de luchar durante un día, encontré la solución que funcionó para mí. Aquí está la respuesta: stackoverflow.com/a/33892569/1820644
kirtan403
Cambié el estado de android: windowTranslucentStatus a falso y está funcionando
Kiran Benny Joseph

Respuestas:

167

Encontré la respuesta en este enlace: el color de la barra de estado no cambia con el diseño relativo como elemento raíz

Entonces resulta que necesitamos quitar el

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

en styles.xml (v21). Y funciona bien para mí.

Phoenix Wang
fuente
Sí, esta es la solución. Porque android: fitSystemWindows causará problemas al hacer que la barra de pestañas sea desplazable. Encontré la misma respuesta pero la publicaste antes. También mencione que esto está sobrescrito por defecto, creo.
jobbert
Esto debe marcarse como la solución aceptada. Este problema se estaba extendiendo por toda mi aplicación, esta solución lo solucionó en todas partes simplemente comentando esa única línea. ¡Me salvó tal dolor de cabeza!
BMB
Estoy usando CoordinatorLayout, por lo que la otra respuesta para nosotros CoordinatorLayout como la raíz no funciona para mí (usar fitSystemWindows = true como se sugirió tampoco funcionó). Esta respuesta me funciona.
Bruce
Sin embargo, ¿qué sucede si necesito que el color de mi barra de estado sea transparente?
nullmn
1
@nullmn, entonces necesitas cambiar el fondo de tu Actividad a otra cosa.
Phoenix Wang
96

(Un poco tarde para la fiesta pero podría ayudar a alguien)

Tuve exactamente el mismo problema. De alguna manera, algunas actividades eran normales, mientras que las nuevas que creé mostraban una barra de estado blanca en lugar de colorPrimaryDarkvalor.

Después de probar varios consejos, noté que las actividades de trabajo normales se usaban CoordinatorLayoutcomo raíz del diseño, mientras que para las otras las había reemplazado por diseños regulares porque no necesitaba las funciones (animación, etc.) proporcionadas por CoordinatorLayout.

Entonces, la solución es hacer CoordinatorLayoutel diseño raíz y luego, dentro de él, agregar la raíz del diseño anterior. Aquí hay un ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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="match_parent"
  android:fitsSystemWindows="true">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <!-- your activity content here-->


  </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

TENGA EN CUENTA que sin android:fitsSystemWindows="true"esta solución no funciona para mí.

Probado en Lollipop y Marshmallow

Mauro Banze
fuente
3
La solución también funcionó para mí. ¿Pero por qué sucede? El color apropiado de la barra de estado se muestra cuando la raíz es DrawerLayout o CoordinatorLayout
user3316561
3
Esto solo funcionó para mí cuando lo agregué android:fitsSystemWindows="true"a CoordinatorLayoutAndroid 8.
Franco
2
@Franco Creo que esta es la parte más relevante de la solución. Digo esto porque tuve CoordinatorLayoutcuando experimenté el mismo problema y la propiedad específica que solucionó esto para mí fueandroid:fitsSystemWindows="true"
Wilhelm
El android:fitsSystemWindows="true"no funcionó para mí. Lo que resolvió mi problema es usar un tema que no está AppTheme.NoActionBaren la actividad con un CoordinatorLayout. No sé por qué eso lo solucionó.
bmdelacruz
CoordinatorLayouto android:fitsSystemWindows="true"ninguno funciona para mí.
Alif Hasnain
17
 <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style

Simplemente reemplace esto, statusBarColor debe ser su color esperado y no TRANSPARENTE

Shrini Jaiswal
fuente
17

Tienes que agregar esta propiedad a tu estilo para ver el contenido

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>
Andrés Páez
fuente
Esto funcionó para mí. Esta debe ser una respuesta aceptada.
abdul rehman
11

Agregue esto en su style.xml

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

y esto en tu onCreate ();

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Michele Lacorte
fuente
1
Gracias, pero esto no funciona. La barra de estado tiene el mismo aspecto.
pt2121
por favor ayude con este problema ... mismo problema aquí ... ninguna de las soluciones hasta ahora funciona
Saeed Jassani
@SaeedJassani Encontré una solución que funcionó para mí. Si tiene el mismo problema, eche un vistazo a mi pregunta y respuesta: stackoverflow.com/a/33892569/1820644
kirtan403
9

Después de intentar sin éxito todo lo anterior, descubrí que establecer explícitamente el tema solucionó el problema.

setTheme(R.style.AppTheme);

Eso tiene que ir antes del super.OnCreate () en su actividad.

James Britton
fuente
1
Puedo confirmar que esto corrige la actividad errante en Marshmallow
dare0021
Te amo hombre, funcionó como un encanto, aunque todavía no tengo idea de por qué: @
Adeel Ahmad
antes del super.OnCreate () es la clave
Karthik Rk
9

Simplemente coloque este elemento en su v21 \ styles.xml:

cierto

Debe tener un aspecto como este :

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

Rami
fuente
1
Me funcionó usando falsevalores en los últimos 2 elementos. Extraño, pero gracias.
JCarlosR
Funciona solo con las dos últimas líneas, pero el contenido va detrás de la barra de estado, el relleno / margen o se ajusta al sistema Windows no ayuda. Probado en OP 5 con turrón
Anton Makov
9

Me enfrenté al mismo problema. Lo que hice fue, en el archivo "v21 / styles.xml", cambié el valor verdadero:

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

a:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>
Degomos
fuente
7
<item name="android:statusBarColor">@android:color/transparent</item>

Verá esa línea de código en values ​​/ styles / styles.xml (v21). Eliminarlo y eso resuelve el problema.

Enlace a esta respuesta

Phares
fuente
5

Solucioné mi problema cambiando el diseño de mi actividad de FrameLayout a RelativeLayout. ¡Gracias a todos los que intentaron ayudar!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/transparent">

    <android.support.v4.view.ViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/theme_primary_dark"
      android:fitsSystemWindows="true" />

</RelativeLayout>

Pruebe el visor de jerarquía o ViewInspector . Estas herramientas pueden ayudarte.

pt2121
fuente
5

Simplemente elimine la siguiente etiqueta del estilo v21 @android: color / transparent

Esto funciona para mi.

Shendre Kiran
fuente
@android: color / transparent no es una "etiqueta". Puede ser el valor de un atributo de estilo, pero no es una "etiqueta". ¿Qué pasa si el OP tiene este valor definido más de una vez? ¿Cuál debería quitar? Tu respuesta es demasiado genérica.
protegido
sí, también fue mi caso ... ¡gracias, Shendre! :) y para su comentario, @protectedmember: el sistema operativo no tiene género.
zeroDivider
3

Mejor enfoque

Compruebe su archivo style.xml donde está su tema NoActionBar. Asegúrese de que tenga un padre como Theme.AppCompat.NoActionBar y también personalícelo agregando su combinación de colores. Finalmente, configure sus temas en manifiesto según sea necesario.

A continuación se muestra una muestra de mi archivo styles.xml (ActionBar + NoActionBar).

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- No ActionBar application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
Nilesh Mahant
fuente
2

Para mí funcionó haciendo lo siguiente:

  1. Establecer el tema .NoActionBar
  2. Envuelva la barra de herramientas en android.support.design.widget.AppBarLayout
  3. Hacer android.support.design.widget.CoordinatorLayoutcomo diseño principal.

Esencialmente, es el tercer paso que dibuja la barra de estado en el colorPrimaryDarkcaso contrario, no se dibuja si usa el NoActionBartema. El segundo paso le dará a su barra de herramientas esa superposición .

priyankvex
fuente
2

Para estilos v23

 <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

Para estilos v21

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>
Ankit Aman
fuente
2

[Salida]

Expanda res -> valores -> directorio de estilos desde el panel del proyecto.

Abra styles.xml (v21)

UTILICE CUALQUIERA DE ABAJO MANERA

  1. Cambie verdadero a falso en la android:windowDrawsSystemBarBackgroundspropiedad.
  2. Cambie @android: color / transparent a @ color / colorPrimaryDark en la android:statusBarColorpropiedad.
  3. Elimina la android:statusBarColorlínea de propiedad.
Ketan Ramani
fuente
2

Si su v21 / styles.xml contiene

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

Luego, elimine o comente debajo de la línea o cambie el color de la barra de estado,

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

Está funcionando bien. Espero que esto sea útil. Gracias.

sahu
fuente
2

He encontrado una solución para esto.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>

agregue esto a su estilo y funcionará para api 21 o superior.

being_sohelkhan
fuente
1

No estoy seguro de si es tarde, pero espero que ayude a alguien. * Cree una vista falsa con fondo transparente que se ajuste al diseño y haga un diseño de coordinador como elemento de diseño raíz.

<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:fitsSystemWindows="true" />


<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/something" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   .... YOUR LAYOUT

Vahidlazio
fuente
1

Esto tiene trabajo para mi

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
Valdemir Nunes de Freitas
fuente
1
Hola, bienvenido a StackOverflow. ¿Podría editar su respuesta para explicar por qué funciona esta respuesta? ¡Las explicaciones breves de su código son muy útiles!
Gigazelle
0

Supongo que esto es causado por su android:windowBackground. ¿Es @color/background_material_lightuna referencia al blanco?

Hanspeide
fuente
No Definitivamente no es blanco, ¡pero gracias de todos modos! (Puede ver los íconos blancos en él.)
pt2121
He leído mal tu pregunta. Intente reemplazar <item name="android:statusBarColor">@android:color/transparent</item>con <item name="android:statusBarColor">@null</item>.
Hanspeide
Solo para asegurarme de que lo entiendo correctamente, ¿desea que la imagen se muestre detrás de la barra de estado?
Hanspeide
0

Compruebe que esta barra de herramientas se vuelve blanca: AppBar no se dibuja después de desplazarse fuera de la pantalla

https://code.google.com/p/android/issues/detail?id=178037#c19

Estoy usando las bibliotecas 23.0.0. y el error todavía ocurre.

La solución para esto es agregar una Vista que casi no ocupa espacio y puede ser invisible. Vea la estructura a continuación.

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.Toolbar
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height=".3dp"
        android:visibility="visible"/>

</android.support.design.widget.AppBarLayout>

Estas preguntas en Stackoverflow.com también se refieren a este error: CoordinatorLayout Toolbar invisible al ingresar hasta AppBarLayout de altura completa: el diseño a veces es invisible una vez que ingresa a la vista (incluso si no se ingresa)

clickdroid
fuente
no es el mismo error. en mi caso, es blanco justo después de que se muestre la actividad, no después de haber sido desplazado fuera de la pantalla. gracias de todos modos
pt2121
0

Si está utilizando RelativeLayout / CoordinatorLayout, esta es la solución que funcionó para mí:

Tienes que usar

  • CoordinadorDiseño
  • AppBarLayout

Recuerde usar CoordinatorLayout en lugar de RelativeLayout (el rendimiento es mejor y funciona perfectamente con AppBarLayout)

Así es como debería comenzar tu fragmento

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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="match_parent"
android:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >
    ...

¡Buena codificación!

Faustino Gagneten
fuente
0
 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

agregue el elemento 'windowTranslucentStatus' en estilos

Sanjay
fuente
0

Agregue esto en su style.xml

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

Nota: El color de la barra de estado no se admite por debajo del nivel de API 21.

Raviraj
fuente
-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

Agregue esta línea 2 en el archivo java a continuación

nitin kapsikar
fuente
1
Bienvenido a Stack Overflow. ¿Podría explicar cómo funciona su código y cómo ayuda a resolver la pregunta de OP? Consulte cómo escribir una buena respuesta para mejorar su respuesta
Tom M