J'ai la disposition suivante:
<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>
J'ajoute Fragment
s dans le FrameLayout
, en les remplaçant. Un de mes Fragment
s est une liste, avec la disposition suivante:
<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"/>
Mon problème ici que la barre d’outils est dessinée sur la liste. J'ai essayé de résoudre ce problème en encapsulant le contenu de la CoordinatorLayout
dans un LinearLayout
, qui résolvait le sur-retrait, mais le comportement de défilement de la barre d’application ne fonctionne donc plus.
Toute aide est très appréciée!
Prendre l'attribut
app:layout_behavior="@string/appbar_scrolling_view_behavior"
éteignez la RecyclerView
et placez-la sur la FrameLayout
que vous essayez d'afficher sous la Toolbar
.
J'ai constaté qu'une chose importante dans le comportement de la vue défilante est de disposer le composant sous la barre d'outils. Étant donné que le FrameLayout
a un descendant qui défilera (RecyclerView
), le CoordinatorLayout
obtiendra ces événements de défilement pour déplacer le Toolbar
.
Une autre chose à prendre en compte: ce comportement de mise en page entraînera la taille de la FrameLayout
hauteur comme si le Toolbar
est déjà défilé, et avec le Toolbar
entièrement affichée, la vue entière est simplement abaissée de sorte que le bas de la vue se trouve en dessous du bas de la CoordinatorLayout
.
C'était une surprise pour moi. Je m'attendais à ce que la vue soit redimensionnée de manière dynamique lorsque la barre d'outils défile vers le haut et le bas. Ainsi, si vous avez un composant de défilement avec un composant fixe au bas de votre vue, vous ne verrez pas ce composant du bas tant que vous n'avez pas entièrement fait défiler le Toolbar
.
Ainsi, lorsque j'ai voulu ancrer un bouton au bas de l'interface utilisateur, j'ai corrigé le problème en mettant le bouton au bas de la CoordinatorLayout
(Android:layout_gravity="bottom"
) et en ajoutant une marge inférieure égale à la hauteur du bouton. à la vue sous la barre d'outils.
J'ai réussi à résoudre ce problème en ajoutant:
Android: layout_marginTop = "? Android: attr/actionBarSize"
à la FrameLayout comme suit:
<FrameLayout
Android:id="@+id/content"
Android:layout_marginTop="?android:attr/actionBarSize"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
/>
À partir de Android studio 3.4, vous devez insérer cette ligne dans votre modèle contenant le RecyclerView.
app: layout_behavior = "Android.support.design.widget.AppBarLayout $ ScrollingViewBehavior"