Añadir vistas debajo de la barra de herramientas en CoordinatorLayout


Tengo el siguiente diseño:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/main_content"
    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.support.design.widget.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

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

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</android.support.design.widget.CoordinatorLayout>

Agrego Fragments en el FrameLayout, reemplazándolos. Una de mis Fragments es una lista, que tiene el siguiente diseño:

<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

Mi problema aquí es que la barra de herramientas se dibuja sobre la lista. Traté de resolver eso envolviendo el contenido del CoordinatorLayout en un LinearLayout, que resolvió el sobregiro, pero de esa manera el comportamiento de desplazamiento de appbar ya no funciona.

Cualquier ayuda es muy apreciada!

Author: ZhiXingZhe - WangYuQi, 2015-10-05

2 answers

Tome el atributo

app:layout_behavior="@string/appbar_scrolling_view_behavior"

Fuera del RecyclerView y póngalo en el FrameLayout que está tratando de mostrar debajo del Toolbar.

He encontrado que una cosa importante que hace el comportamiento de vista de desplazamiento es diseñar el componente debajo de la barra de herramientas. Debido a que el FrameLayout tiene un descendiente que se desplazará (RecyclerView), el CoordinatorLayout obtendrá esos eventos de desplazamiento para mover el Toolbar.


Otra cosa a tener en cuenta: Ese comportamiento de diseño hará que la altura FrameLayout se dimensione como si el Toolbar ya estuviera desplazado, y con el Toolbar completamente mostrado, la vista completa simplemente se empuja hacia abajo de modo que la parte inferior de la vista esté debajo de la parte inferior del CoordinatorLayout.

Esto fue una sorpresa para mí. Esperaba que la vista se redimensionara dinámicamente a medida que la barra de herramientas se desplaza hacia arriba y hacia abajo. Por lo tanto, si tiene un componente de desplazamiento con un componente fijo en la parte inferior de su vista, no verá ese componente inferior hasta que haya desplazado completamente el Toolbar.

Así que cuando quería anclar un botón en la parte inferior de la interfaz de usuario, trabajé alrededor de esto poniendo el botón en la parte inferior de la CoordinatorLayout (android:layout_gravity="bottom") y agregar un margen inferior igual a la altura del botón a la vista debajo de la barra de herramientas.

 289
Author: kris larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-31 13:29:02

Logré arreglar esto agregando:

Android:layout_marginTop="?android: attr / actionBarSize "

Al FrameLayout así:

 <FrameLayout
        android:id="@+id/content"
        android:layout_marginTop="?android:attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       />
 48
Author: Michael G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 15:36:14