web-dev-qa-db-fra.com

Ajouter des vues sous la barre d'outils dans CoordinatorLayout

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 Fragments dans le FrameLayout, en les remplaçant. Un de mes Fragments 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!

161
WonderCsabo

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.

328
kris larson

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"
       />
73
Michael G

À 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"

0
Shashank