J'essaie d'obtenir que la barre d'outils se replie lors du défilement lors du défilement d'une vue de recyclage à l'intérieur d'un fragment. Pour commencer, voici ma disposition principale:
<DrawerLayout>
<RelativeLayout
Android:id="@+id/mainRelativeLayout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
>
<Android.support.design.widget.CoordinatorLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
>
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appBarLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
>
<Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:elevation="5dp"
app:layout_scrollFlags="scroll|enterAlways"
>
</Toolbar>
</Android.support.design.widget.AppBarLayout>
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
/>
</Android.support.design.widget.CoordinatorLayout>
</RelativeLayout>
<!-- ignore -->
<drawercontents>
</DrawerLayout>
Comme vous pouvez probablement le deviner, mes fragments sont chargés dans @id/container
. Mon premier fragment contient la vue de recyclage, et j'ai défini app:layout_behavior="@string/appbar_scrolling_view_behavior"
sur ce recyclage. Cela fonctionne, et la barre d'outils s'effondre lors du défilement. Le problème est que la barre d'outils couvre le contenu supérieur du fragment lorsqu'il n'est pas réduit. L'ajout d'une marge supérieure au conteneur de fragments égale à la taille de la barre d'outils ne fait que laisser un espace vide lorsque la barre d'outils s'effondre (évidemment).
Qu'est-ce qui manque ici? Des idées?
EDIT: Comme demandé, voici la disposition du fragment contenant la vue de recyclage:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.RecyclerView
Android:id="@+id/feed"
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:background="#00000000"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout 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/tabanim_appbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<Android.support.v7.widget.Toolbar
Android:id="@+id/tabanim_toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recyclerView"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.design.widget.CoordinatorLayout>
Je n'ai pas encore testé cela, mais voici ce que vous devez faire:
app:layout_behavior="@string/appbar_scrolling_view_behavior"
au FrameLayout
avec l'id container
.Android:fitsSystemWindows = "true"
à votre AppBarLayout
.C'est exactement ce que je fais dans mon application, et cela fonctionne. Si cela ne fonctionne pas pour vous, essayez de nettoyer (sur Android Studio, Build -> Clean Project) votre projet et relancez l'application.
Mon ami, je l'ai fait aujourd'hui et fonctionne parfaitement, j'ai 2 fragments qui ont tous les deux RecyclerView
et peuvent faire défiler Toolbar
. J'ai regardé chrisbanes's
CheeseSquare
: CheeseSquare
Si vous jetez un œil à MainActivity
, il y a 3 fragments dans TabLayout
et tous peuvent faire défiler Toolbar
. J'ai donc préparé cette mise en page, peut-être que vous examinerez:
mon activity_home.xml
:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<include layout="@layout/content_home"/>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
Android:layout_gravity="start"
app:menu="@menu/homepage_leftdrawer">
</Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>
Et content_home.xml
:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/root"
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/AppTheme3.AppBarOverlay">
<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|snap" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabTextColor="@color/Transparent_few_white"
app:tabIndicatorColor="@color/White"
app:tabTextAppearance="@style/TabLayoutTextStyle"
app:tabIndicatorHeight="3dp"
app:tabSelectedTextColor="@color/White"
Android:background="@color/ColorPrimary"
app:tabPaddingStart="0dp"
app:tabPaddingEnd="0dp"/>
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/pager2"
Android:layout_height="match_parent"
Android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</Android.support.design.widget.CoordinatorLayout>
Où est la clé ici:
Si vous jetez un œil à mon ViewPager
, il a app:layout_behavior="@string/appbar_scrolling_view_behavior"
attribute Puis c'est tout. N'ajoutez aucun autre comportement en fragment. Essayez comme ça et venez avec le résultat s'il vous plaît!
Vous pouvez utiliser la disposition Réduire comme
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true">
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:fitsSystemWindows="true"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<Android.support.design.widget.CollapsingToolbarLayout
Android:id="@+id/collapse_toolbar"
Android:layout_width="match_parent"
Android:layout_height="200dp"
Android:fitsSystemWindows="true"
app:contentScrim="@color/zxing_transparent"
Android:paddingBottom="2dip"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:expandedTitleGravity="bottom|center_horizontal"
app:expandedTitleMarginBottom="50dip"
app:collapsedTitleGravity="top|center_vertical"
app:collapsedTitleTextAppearance="@style/collapseTitle">
<Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:elevation="5dp"
app:layout_scrollFlags="scroll|enterAlways"
>
</Toolbar>
</Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
/>
</Android.support.design.widget.CoordinatorLayout>
Vous pouvez résoudre ce problème en ajoutant un troisième indicateur - snap
, à layout_scrollFlags
propriété.
<Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:elevation="5dp"
app:layout_scrollFlags="scroll|enterAlways|snap" />
L'utilisation de cette option déterminera la marche à suivre lorsqu'une vue seulement a été partiellement réduite. Si le défilement se termine et que la taille de la vue a été réduite à moins de 50% de sa taille d'origine, cette vue revient à sa taille d'origine. Si la taille est supérieure à 50% de sa taille, elle disparaîtra complètement.
vérifiez cela lien .
Vous avez besoin de quelque chose de similaire à l'application Play Store. Coller les dispositions ici. Le code pour cela est facile et vous pouvez le coder vous-même.
Avec la hiérarchie de mise en page ci-dessus, vous pouvez réaliser quelque chose comme ceci:
Faites un nom de mise en page en tant que toolbar.xml et incluez-le dans votre code où vous voulez utiliser, mais rappelez une chose s'il vous plaît n'utilisez aucune autre mise en page comme Relativelayout, Linearlayout et autre ci-dessus de
J'ai utilisé un SwipeRefreshLayout
ou juste un LinearLayout
ou RelativeLayout
comme racine de la disposition du Fragment
et ça fonctionne.
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.SwipeRefreshLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/swipe_refresh_layout_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/mycustomcolor"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.v4.widget.SwipeRefreshLayout>
Avec RelativeLayout
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/fragment2"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view_Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentStart="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</RelativeLayout>
Alors ça devrait être bon d'y aller.
<Android.support.design.widget.CollapsingToolbarLayout
Android:id="@+id/collapsing_toolbar_layout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:contentScrim="?attr/colorPrimary"
>
<Android.support.v7.widget.Toolbar
Android:id="@+id/appBar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_collapseMode="pin" />
</Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:layout_below="@+id/app_bar_layout"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
Android:weightSum="1">
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/colorAccent"
>
<TextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:text="Your recycler view should go here"/>
</FrameLayout>
</LinearLayout>
A également rencontré ce problème. Mais une solution a été trouvée. La solution avec retouche xml ne peut pas l'être, vous devez donc le faire par programme. Tout ce dont nous avons besoin est gonfleur. Oui, oui, c'est tellement simple. À la volée, changez le xml pour faire défiler tout.