web-dev-qa-db-fra.com

Masquage de la barre d'outils sur le défilement avec recyclage à l'intérieur du fragment

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"/>
25
Orbit
<?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>
9
Laurence Pardz

Je n'ai pas encore testé cela, mais voici ce que vous devez faire:

  • Bouge le app:layout_behavior="@string/appbar_scrolling_view_behavior" au FrameLayout avec l'id container.
  • Ajouter 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.

4

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'sCheeseSquare: 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!

3
Yasin Kaçmaz

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>
3
Uma Achanta

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 .

3
pavle

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.

  1. FrameLayout
    • ImageView
    • ScrollView
      1. Disposition linéaire
      2. HorizontalScrollView
        • Disposition linéaire
    • ToolBar

Avec la hiérarchie de mise en page ci-dessus, vous pouvez réaliser quelque chose comme ceci:

enter image description here

3
Swathin

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

3
patel135

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.

2
ʍѳђઽ૯ท
    <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>

enter image description here

0
Arif Nouman Khan

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.

0
Trancer