tutorial scrollflags layout_collapsemode example coordinatorlayout coordinator collapsing appbarlayout android material-design android-support-library statusbar android-coordinatorlayout

android - scrollflags - layout_collapsemode



CoordinatorLayout no dibuja detrás de la barra de estado incluso con windowTranslucentStatus y fitsSystemWindows (3)

Estoy tratando de dibujar vistas detrás de la barra de estado como esta:

Intenté producir este efecto con las técnicas recomendadas, pero obtengo esto:

De la captura de pantalla se desprende claramente que ninguno de los contenidos de mi aplicación se está dibujando detrás de la barra de estado.

Lo que es interesante es que de alguna manera, el Nav Drawer logra dibujar detrás de la barra de estado:

Cosas que hice:

  • Use los widgets de la biblioteca de soporte: CoordinatorLayout , AppBarLayout , Toolbar , DrawerLayout
  • windowTranslucentStatus establecido en true en el tema de mi aplicación
  • fitsSystemWindows establecido en true en mi CoordinatorLayout

Este es el tema de mi aplicación:

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

Este es el diseño de mi actividad:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <FrameLayout android:id="@+id/page_container" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"/> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> </android.support.v4.widget.DrawerLayout>

El FrameLayout en mi diseño de actividad se reemplaza con este diseño de fragmento:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:background="@android:color/holo_blue_bright" tools:context=".MainActivity"> <TextView android:text="@string/lorem_ipsum" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout> <android.support.design.widget.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent" app:elevation="0dp" android:theme="@style/AppTheme.TransparentAppBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@android:color/transparent" app:title="@string/hello_blank_fragment" app:popupTheme="@style/AppTheme.OverflowMenu" /> </android.support.design.widget.AppBarLayout> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout>


  1. Si quiero dibujar detrás de StatusBar , uso CoordinatorLayout como la vista principal de la Actividad (android: fitsSystemWindows = "false")

styles.xml (v21)

<style name="MyTheme.NoActionBar.TransparentStatusBar"> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowTranslucentStatus">true</item> </style>

Entonces, si desea cambiar statubarcolor, debe eliminar TRANSLUENT_FLAG de esta manera.

Window window = activity().getWindow(); if(showTransluent){ window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(Color.TRANSPARENT); }else { window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(ContextCompat.getColor(activity(), R.color.colorPrimaryDark)); }

  1. Si quiero que StatusBar sea ​​transluyente y simultaneamente, la vista se mantiene alejada de la ocultación detrás de StatusBar que uso como la mayoría de los padres FrameLayout con argumento

Mis estilos.xml (v21) se parecen a

<resources> <style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> <style name="AppTheme.NoStatusBar" parent="AppTheme.NoActionBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="windowActionBarOverlay">true</item> <item name="android:windowActionBarOverlay">true</item> </style> </resources>

Y styles.xml

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

Quizás la clave de puntos aquí es asegurarse de que utilice AppCompactActivity , así como también use Theme.AppCompact como raíz para sus estilos.


Esto fue realmente confuso para mí, pero finalmente lo descubrí por mi combinación de vistas que se ve así:

<android.support.v4.widget.SwipeRefreshLayout - **no fitsSystemWindow set** <android.support.design.widget.CoordinatorLayout- android:fitsSystemWindows="true" <android.support.design.widget.AppBarLayout - android:fitsSystemWindows="true" <android.support.design.widget.CollapsingToolbarLayout - android:fitsSystemWindows="true" <RelativeLayout - android:fitsSystemWindows="true" <ImageView - android:fitsSystemWindows="true"

También utilicé los métodos publicados por Budius en mi aplicación para que la barra de estado transparente funcionara:

Elimine el android: windowTranslucentStatus de su XML y en Java use así:

public static void setTranslucentStatusBar(Window window) { if (window == null) return; int sdkInt = Build.VERSION.SDK_INT; if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) { setTranslucentStatusBarLollipop(window); } else if (sdkInt >= Build.VERSION_CODES.KITKAT) { setTranslucentStatusBarKiKat(window); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void setTranslucentStatusBarLollipop(Window window) { window.setStatusBarColor( window.getContext() .getResources() .getColor(R.color. / add here your translucent color code /)); } @TargetApi(Build.VERSION_CODES.KITKAT) private static void setTranslucentStatusBarKiKat(Window window) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); }


edite para futuros lectores: hay mucha información buena sobre el tema y también sobre los comentarios, asegúrese de leerlos.

Respuesta original: tu tema es incorrecto, por eso. Desafortunadamente, hay diferencias sobre cómo activarse en Kitkat o Lollipop. En mi código lo hice en Java, pero también puedes lograrlo en XML si quieres jugar con las carpetas V21 en tu árbol de recursos. El nombre de los parámetros será muy similar al de las contrapartes de Java.

Elimine el android:windowTranslucentStatus de su XML y en Java use así:

public static void setTranslucentStatusBar(Window window) { if (window == null) return; int sdkInt = Build.VERSION.SDK_INT; if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) { setTranslucentStatusBarLollipop(window); } else if (sdkInt >= Build.VERSION_CODES.KITKAT) { setTranslucentStatusBarKiKat(window); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void setTranslucentStatusBarLollipop(Window window) { window.setStatusBarColor( window.getContext() .getResources() .getColor(R.color. / add here your translucent color code /)); } @TargetApi(Build.VERSION_CODES.KITKAT) private static void setTranslucentStatusBarKiKat(Window window) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); }

luego puede llamar desde su actividad setTranslucentStatusBar(getWindow());

editar:

hacer que la barra de estado sea translúcida y dibujar detrás de ella (por alguna razón no puedo entender) son dos tareas separadas en Android.

He buscado más en mi código y estoy seguro de que tengo MUCHO más android:fitsSystemWindows="true" en mi diseño que solo el CoordinatorLayout .

A continuación se muestran todas las vistas en mi diseño con android:fitsSystemWindows="true" en ellos:

  • CoordinatorLayout
  • AppBarLayout
  • ColapsarToolbarLayout
  • ImageView (con la imagen de fondo)
  • FrameLayout (con el contenido del encabezado)

así que mi sugerencia es simplemente probar / intentar rellenar android:fitsSystemWindows="true" en su XML.