web-dev-qa-db-fra.com

Réduire ou développer par programme CollapsingToolbarLayout

Question simple, mais je ne trouve pas de réponse. Comment puis-je réduire ou développer la CollapsingToolbarLayout par programme?

collapsed toolbar

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

expanded toolbar

135
Tomas

À l'aide de Support Library v23, vous pouvez appeler appBarLayout.setExpanded(true/false).

Pour en savoir plus: AppBarLayout.setExpanded (boolean)

272
jaxvy

J'utilise ce code pour réduire la barre d'outils. Je n'arrive toujours pas à trouver un moyen de l'étendre.

public void collapseToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
    }
}

Edit 1: La même fonction avec vélocité négativeY mais la barre d'outils n'est pas développée à 100% et false pour le dernier param devrait fonctionner

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
    }
}

Edit 2: Ce code fait l'affaire pour moi

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.setTopAndBottomOffset(0);
        behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
    }
}
  • setTopAndBottomOffset ne développe la barre d'outils
  • onNestedPreScroll n'affiche le contenu que dans la barre d'outils développée

Je vais essayer de mettre en œuvre le comportement par moi-même.

48
Tuấn Trần Anh

Vous pouvez définir l’agrandissement ou la réduction de votre animation personnalisée . Utilisez simplement la setTopAndBottomOffset(int).

Voici un exemple:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt();
    valueAnimator.setInterpolator(new DecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
            appBar.requestLayout();
        }
    });
    valueAnimator.setIntValues(0, -900);
    valueAnimator.setDuration(400);
    valueAnimator.start();
}
21
Koho

J'ai écrit une petite extension à AppBarLayout. Il permet d’élargir et de réduire la CollapsibleToolbarLayout avec et sans animation. Il semble que tout se passe bien. 

N'hésitez pas à l'essayer.

Utilisez-le simplement à la place de votre AppBarLayout et vous pourrez appeler des méthodes chargées de développer ou de réduire la CollapsingToolbarLayout.

Cela fonctionne exactement comme prévu dans mon projet, mais vous devrez peut-être ajuster les valeurs fling/scroll dans les méthodes perform... (en particulier dans performExpandingWithAnimation()) pour qu'elles correspondent parfaitement à votre CollapsibleToolbarLayout.

12
Bartek Lipinski

pour ceux qui veulent travailler avec onNestedPreScroll et obtenir une erreur comme moi ...__

    CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
    //below line
    params.setBehavior(new AppBarLayout.Behavior() {});

et ne fonctionne pas correctement avec cela . mais je contourner ce problème avec 

dans onCreate:

        scrollToolbarOnDelay();

et...

    public void scrollToolbarOnDelay() {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
                    CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
                    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
         if(behavior!=null)
                    behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
         else
            scrollToolbarOnDelay()
                }
            }, 100);


        }
5
Sepehr

Utilisez mAppBarLayout.setExpanded(true) pour développer la barre d’outils et mAppBarLayout.setExpanded(false) pour la réduire.

Si vous souhaitez modifier CollapsingToolbarLayout height par programme, utilisez simplement mAppBarLayout.setLayoutParams(params);

Développer:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);

Effondrer:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
4
Ferdous Ahamed

Essaye ça...

Développer

appBarLayout.setExpanded(true, true);

Rappeler

appBarLayout.setExpanded(false, true);
0
Victor Sam VS

j'ai utiliser cela

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }
0
ssdeno

Cela peut aider à développer ou à s'effondrer: 

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);
0
ROHIT LIEN