¿Por qué mi diseño se ensucia después de borrar el flag FLAG_TRANSLUCENT_STATUS?

Tengo una sola aplicación de actividad. Muestra un LoginFragment que hace que las barras de estado y de navegación sean translúcidas para que pueda mostrar una imagen de fondo detrás de ella. Sin embargo, después de iniciar sesión, este fragmento se reemplaza por otro fragmento que necesita mostrar las sólidas barras de estado y navegación. Por lo tanto, antes de que se elimine el objeto LoginFragment , LoginFragment las banderas que había establecido, para que las barras LoginFragment opacas.

El problema que enfrento es que después de iniciar sesión, el fragmento con estado normal y barras de navegación tiene su barra de acción desplazada hacia abajo. Si giro mi pantalla al paisaje y luego de nuevo al retrato para forzar la recreación del diseño, la barra de acción se encaja de nuevo en la posición correcta.

Cuando la barra de estado es translúcida. Esto está perfectamente bien. Cuando la barra de estado es translúcida. Esto está perfectamente bien.

En la siguiente pantalla La barra de acción se desplaza hacia abajo. También tenga en cuenta que la barra de estado es de color negro, debería haber sido gris, según el tema. En la siguiente pantalla La barra de acción se desplaza hacia abajo.

Ahora si vuelvo a la primera pantalla, la barra translúcida superior está bien, pero todo el contenido se desplaza hacia arriba, dejando un espacio blanco en blanco a continuación. Ahora si vuelvo a la primera pantalla, la barra translúcida superior está bien, pero todo el contenido se desplaza hacia arriba, dejando un espacio blanco en blanco a continuación.

Código en LoginFragment que programaticamente hace las barras translúcidas y también las restaura: –

 @Override public void onResume() { super.onResume(); if (hasTransparentStatusBar()) { setStatusBarTranslucent(); } } @Override public void onPause() { if (hasTransparentStatusBar()) { setStatusBarOpaque(); } super.onPause(); } protected boolean hasTransparentStatusBar() { return true; } protected void setStatusBarTranslucent() { if (Build.VERSION.SDK_INT >= 21) { Window window = getActivity().getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } protected void setStatusBarOpaque() { if (Build.VERSION.SDK_INT >= 21) { Window window = getActivity().getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } 

Layout xml de Actividad: –

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.app.MainActivity" > <!-- The main content view --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@color/divider" android:dividerHeight="0dp" android:background="@color/primary" /> </android.support.v4.widget.DrawerLayout> 

LoginFragment de LoginFragment xml: –

 <ImageView android:layout_width="wrap_content" android:layout_height="200dp" android:src="@drawable/logo" android:id="@+id/logo" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:padding="@dimen/default_margin" android:text="Login using Facebook" android:textColor="@android:color/white" android:background="@drawable/com_facebook_button_background" android:id="@+id/authButton" android:layout_below="@+id/logo" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

Tuve el mismo problema antes, así que si alguien tropieza con esto, la solución correcta es establecer el indicador NO_LIMITS :

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } 

Tuve problemas similares y parece que deberíamos establecer banderas de ventana antes onActivityCreated (Bundle) . A menudo estoy usando métodos estáticos para mostrar mis fragmentos, como esto:

 public class FragmentPlayer extends MediaFragment { public FragmentPlayer() { // Default public constructor required. } public static void show(@NonNull Activity activity, boolean compact) { boolean isOrientationPortrait = UiHelper.isOrientationPortrait(activity); setupWindow(activity.getWindow(), isOrientationPortrait, compact); FragmentManager fragmentManager = activity.getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); FragmentPlayer newFragment = FragmentPlayer.getInstance(compact); transaction.replace(R.id.fragment_player, newFragment); transaction.commit(); } private static void setupWindow(@NonNull Window window, final boolean isOrientationPortrait, final boolean compact) { if (compact) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } else { if (isOrientationPortrait) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } else { window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } } } 

Como se puede ver, moví todas las inicializaciones de ventana de onCreateActivity(Bundle) al método estático setupWindow(Window, boolean, boolean) y ahora todo funciona bien.

Todavía no sé por qué la disposición realmente se ensució al llamar a los métodos de onCreateActivity(Bundle) , pero eso es el comienzo.

Edición 1: oh, y no olvide también configurar su Window en Activity.onCreate(Bundle) para manejar correctamente rotaciones de pantalla!

He intentado todas las posibilidades para solucionar este problema y encontré una solución clara. Primero haz las cosas que se muestran en el video de youtube y añade android:fitsSystemWindows="true" a android.support.v7.widget.Toolbar en xml.

  • Android página curl efecto para árabe
  • Android edittext auto crecer con el texto y empujar las cosas hacia abajo
  • Cómo guardar el lienzo de dibujo en android?
  • Android Video no se ajusta a la anchura en el retrato de la videovista y no ocupa la pantalla completa en el paisaje
  • Mapview y Fragmento
  • El usuario se toca rápidamente en MediaController. El error sólo ocurre en Nexus 4.
  • Android: Girar animación volver a su estado real después de terminar la animación?
  • Cómo pasar los eventos de toque a la vista principal
  • El texto de CheckBox de Android no se muestra
  • ¿Cómo alineo una barra de herramientas de Android en la parte inferior de la pantalla?
  • Comportamiento extraño de ListView con CheckBox
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.