android - ejemplo - Agregar vistas debajo de la barra de herramientas en CoordinatorLayout
menu desplegable android studio (3)
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
Fragment
s en
FrameLayout
, reemplazándolos.
Uno de mis
Fragment
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 de
CoordinatorLayout
en
LinearLayout
, que resolvió el sobregiro, pero de esa manera el comportamiento de desplazamiento de la barra de aplicaciones ya no funciona.
¡Cualquier ayuda es muy apreciada!
A partir de Android Studio 3.4, debe poner esta línea en su diseño que contiene el RecyclerView.
aplicación: layout_behavior = "android.support.design.widget.AppBarLayout $ ScrollingViewBehavior"
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"
/>
Toma el atributo
app:layout_behavior="@string/appbar_scrolling_view_behavior"
fuera de
RecyclerView
y
FrameLayout
en
FrameLayout
que está intentando mostrar debajo de la
Toolbar
.
Descubrí que una cosa importante que hace el comportamiento de la vista de desplazamiento es diseñar el componente debajo de la barra de herramientas.
Debido a que
FrameLayout
tiene un descendiente que se desplazará (
RecyclerView
),
CoordinatorLayout
obtendrá esos eventos de desplazamiento para mover la
Toolbar
.
Otra cosa a tener en cuenta: ese comportamiento de diseño hará que la altura de
FrameLayout
se dimensione
como si la
Toolbar
ya estuviera desplazada
, y con la
Toolbar
completamente mostrada, toda la vista simplemente se empuja hacia abajo para que la parte inferior de la vista esté debajo del parte inferior del
CoordinatorLayout
.
Esta fue una sorpresa para mi.
Esperaba que la vista cambiara de tamaño dinámicamente a medida que la barra de herramientas se desplaza hacia arriba y hacia abajo.
Entonces, 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 la
Toolbar
.
Entonces, cuando quería anclar un botón en la parte inferior de la interfaz de usuario, lo
android:layout_gravity="bottom"
colocando el botón en la parte inferior de
CoordinatorLayout
(
android:layout_gravity="bottom"
) y agregando un margen inferior igual a la altura del botón ver debajo de la barra de herramientas.