Réduire ou développer par programme CollapsingToolbarLayout

159

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

barre d'outils réduite

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

barre d'outils développée

Tomas
la source
1
Je me demandais la même chose. Il pourrait également être intéressant d'étendre la barre d'outils en plein écran une fois qu'un utilisateur clique sur la mise en page intégrée (par exemple, image).
Moritz

Réponses:

322

À l'aide de la bibliothèque de support v23, vous pouvez appeler appBarLayout.setExpanded(true/false).

Lectures complémentaires: AppBarLayout.setExpanded (booléen)

jaxvy
la source
2
Ok, merci pour le conseil, mais les bibliothèques de support v23 sont très boguées, donc je ne peux pas la tester maintenant, car je dois rester sur 22.2.1 ....
Tomas
Maintenant, vous avez 23.0.1 avec quelques correctifs
Mario Velasco
6
Est-il possible de définir une animation personnalisée avec les bibliothèques de support 23.1.1? setExpanded (boolean, true) a une animation vraiment lente ...
Nifhel
J'ai eu un problème où j'ai une mise en page avec une barre d'outils pliable et une vue de recyclage en dessous. Lors de la suppression d'éléments de la vue de recyclage, la barre d'outils ne se comportait pas correctement, je développais donc la disposition de la barre d'application et cela fonctionnait correctement. J'ai fini par utiliser appBarLayout.setExpanded (true, true) pour l'animation.
Ray Hunter
48

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 une vitesse négative Y mais la barre d'outils n'est pas étendue à 100% et false pour le dernier paramètre 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 développe la barre d'outils
  • onNestedPreScroll affiche le contenu dans la barre d'outils développée

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

Tuấn Trần Anh
la source
2
Edit 1 fonctionnera également si vous définissez le dernier paramètre de onNestedFlingsur false.
Ricky Lee
2
params.getBehavior () renvoie null. Dans xml, la balise layout_behaviour est définie sur le frère NestedScrollView, et non sur AppBarLayout. Pouvez-vous m'aider?
User31689
Je vous remercie. L'édition 1 fonctionne correctement, si le dernier paramètre est faux. :)
Sirelon
@GobletSky J'ai rencontré le même problème. J'avais NestedScrollView dans mon fragment et j'ai essayé d'appeler onNestedFling avant de définir le fragment. Après avoir défini le fragment, je pourrais appeler la méthode avec succès.
usp
@usp En fait, mon problème était entièrement différent (erreur quelque peu noobish). Voir ceci: stackoverflow.com/questions/31067082/…
User31689
27

Vous pouvez définir son expansion ou sa réduction avec votre animateur personnalisé. Utilisez simplement le 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();
}
Gerhard
la source
2
C'est la seule réponse qui vous permet réellement d'animer avec un décalage personnalisé. Merci beaucoup!
Guilherme Torres Castro
2
appBar.setExpanded (faux, vrai); (ouvrir / fermer, animer) Vous n'avez pas besoin d'écrire toutes ces lignes
Puni
2
à @Puni, si vous voulez développer / réduire à un décalage "personnalisé" (comme faire plusieurs étapes de réduction), vous en aurez besoin.
曾 其 威
C'est la meilleure solution pour animer le décalage AppBar au cas où vous ne voudriez pas écrire un comportement personnalisé. La seule mise à jour de l'extrait de code consiste à appeler valueAnimator.setIntValues ​​() avec la valeur de départ behavior.topAndBottomOffset au lieu de 0 pour démarrer l'animation à partir du décalage actuel de la barre d'applications.
bobine du
Pour utiliser une variable personnalisée ( -900 )pour définir valueAnimator.setIntValuesLa meilleure solution est celle d'utiliser- ( appBar.getTotalScrollRange() )
Ali Rezaiyan
12

J'ai écrit une petite extension sur AppBarLayout. Il permet d'agrandir et de réduire les CollapsibleToolbarLayoutdeux avec et sans animation. Il semble bien faire les choses.

N'hésitez pas à l'essayer.

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

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

Bartek Lipinski
la source
@ssdeno, veuillez lire le Readme.md de l'essentiel de Github. Il est obsolète depuis la version 23 de la bibliothèque de support. Depuis la v23 de Support (passant à AndroidX), il existe une setExpandedméthode dans le AppBarLayout.
Bartek Lipinski
6

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

Si vous souhaitez modifier la hauteur de CollapsingToolbarLayout 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);
Ferdous Ahamed
la source
1
Cela m'a beaucoup aidé.
NoName
1
C'est tellement utile. Je vous remercie!
sunlover3
5

pour ceux qui veulent travailler avec onNestedPreScroll et obtenir une erreur comme moi. j'obtiens NullPointerException dans onCreate sans cette ligne

    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 contourne 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);


        }
Sepehr Nozaryian
la source
1

Essaye ça...

Développer

appBarLayout.setExpanded(true, true);

Se rappeler

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

Cela peut aider à développer ou réduire:

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

je l'utilise

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

Pour développer / réduire AppBarLayout par programme:

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
avisper
la source