web-dev-qa-db-fra.com

Afficher la vue lorsque la barre d'outils se replie

J'ai une activité avec un CoordinatorLayout, AppBarLayout, CollapsingToolbarLayout et Toolbar. Donc, en gros, une vue qui s'effondre lors du défilement d'un RecyclerView.

Ce que je dois faire est d'afficher une vue personnalisée lorsque la vue de la disposition développée est masquée en raison de l'effondrement.

Voici ma mise en page:

<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:id="@+id/appbar"
        Android:layout_width="match_parent"
        Android:layout_height="192dp"
        Android:fitsSystemWindows="true"
        Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsing_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:fitsSystemWindows="true"
            app:contentScrim="#2196F3"
            app:expandedTitleMarginBottom="32dp"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include
                Android:id="@+id/header"
                layout="@layout/header_big_first_screen"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:fitsSystemWindows="true"
                Android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"/>

            <Android.support.v7.widget.CollapsingToolbarLayout
                Android:id="@+id/anim_toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

                <TextView

                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:text="Hello!"/>


            </Android.support.v7.widget.CollapsingToolbarLayout>


        </Android.support.design.widget.CollapsingToolbarLayout>

    </Android.support.design.widget.AppBarLayout>

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/categories_recyclerview"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>


</Android.support.design.widget.CoordinatorLayout>

Au final, lorsque la barre d'outils est développée, la vue chargée avec l'élément est affichée. Quand il est effondré, ce n'est pas le cas. Lorsqu'il disparaît, le TextView à l'intérieur du Toolbar devrait être affiché. Actuellement, il montre tout le temps.

J'ai cherché dans les événements de CollapsingToolbarLayout pour ajouter un écouteur quand il change de taille afin que je puisse vérifier si c'est plus petit qu'une valeur et montrer cette vue.

Cela peut être un peu difficile à expliquer, mais je crois que je me suis bien fait comprendre. J'ai fait des recherches sur Google et je ne trouve personne qui essaie de faire de même.

22
Miguel Ribeiro

En jetant un œil à la source CollapsingToolbarLayout, les animations de canevas de contenu sont déclenchées via un OnOffsetChangedListener sur le AppBarLayout. Vous pouvez donc en ajouter un autre pour déclencher des animations alpha sur votre vue texte:

mListener = new AppBarLayout.OnOffsetChangedListener() {
    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        if(collapsingToolbar.getHeight() + verticalOffset < 2 * ViewCompat.getMinimumHeight(collapsingToolbar)) {
            hello.animate().alpha(1).setDuration(600);
        } else {
            hello.animate().alpha(0).setDuration(600);
        }
    }
};

appBar.addOnOffsetChangedListener(mListener);
53
tachyonflux