Comprimi o espandi a livello di codice CollapsingToolbarLayout


159

Domanda semplice, ma non riesco a trovare una risposta. Come posso comprimere o espandere a livello di CollapsingToolbarLayoutcodice?

barra degli strumenti compressa

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

barra degli strumenti espansa


1
Mi chiedevo la stessa cosa. Potrebbe anche essere interessante espandere la barra degli strumenti a schermo intero quando un utente fa clic sul layout incorporato (ad es. Immagine).
— Moritz,

Risposte:


322

Utilizzando Support Library v23, è possibile chiamare appBarLayout.setExpanded(true/false).

Ulteriori letture: AppBarLayout.setExpanded (booleano)


2
Ok, grazie per il suggerimento, ma le librerie di supporto v23 sono molto difettose, quindi non posso provarlo ora, perché devo rimanere il 22.2.1 ....
— Tomas

Ora hai 23.0.1 con alcune correzioni
— Mario Velasco

6
È possibile definire un'animazione personalizzata con le librerie di supporto 23.1.1? setExpanded (boolean, true) ha un'animazione davvero lenta ...
— Nifhel

Ho avuto un problema in cui ho un layout con una barra degli strumenti pieghevole e un recyclerview sotto di esso. Quando si eliminano elementi dal recyclerview la barra degli strumenti non si è comportata in modo appropriato, quindi avrei ampliato il layout della barra dell'app e ha funzionato correttamente. Ho finito per usare l'appBarLayout.setExpanded (true, true) per l'animazione.
— Ray Hunter,

48

Uso questo codice per ridurre la barra degli strumenti. Non riesco ancora a trovare un modo per espanderlo.

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

Modifica 1: la stessa funzione con velocità negativaY ma la barra degli strumenti non è espansa al 100% e false per l'ultimo parametro dovrebbe funzionare

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

Modifica 2: questo codice fa il trucco per me

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 espande la barra degli strumenti
  • onNestedPreScroll mostra il contenuto all'interno della barra degli strumenti espansa

Cercherò di attuare il comportamento da solo.


2
Modifica 1 funzionerà anche se imposti l'ultimo parametro di onNestedFlinga false.
— Ricky Lee,

2
params.getBehavior () restituisce null. In xml, il tag layout_behaviour è impostato sul fratello NestedScrollView, non su AppBarLayout. Mi potete aiutare?
— User31689,

Grazie. Modifica 1 funziona correttamente, se l'ultimo parametro è falso. :)
— Sirelon,

@GobletSky Ho affrontato lo stesso problema. Avevo NestedScrollView nel mio frammento e ho provato a chiamare onNestedFling prima di impostare il frammento. Dopo aver impostato il frammento, ho potuto chiamare il metodo con successo.
— usp,

@usp In realtà, il mio problema era completamente diverso (errore un po 'noobish). Vedere questo: stackoverflow.com/questions/31067082/...
— User31689

27

Puoi definire quanto si espande o collassa con il tuo animatore personalizzato. Basta usare il setTopAndBottomOffset(int).

Ecco un esempio:

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();
}

2
Questa è l'unica risposta che ti consente di animare un offset personalizzato. Grazie molto!
— Guilherme Torres Castro,

2
appBar.setExpanded (false, true); (apri / chiudi, anima) Non è necessario scrivere tutte quelle righe
— Puni

2
su @Puni, se desideri espandere / comprimere su un offset "personalizzato" (come eseguire il collasso di più fasi), ti servirà.
— 曾 其 威

Questa è la soluzione migliore per animare l'offset AppBar nel caso in cui non si desideri scrivere un comportamento personalizzato. L'unico aggiornamento dello snippet di codice consiste nel chiamare valueAnimator.setIntValues ​​() con il valore iniziale behavior.topAndBottomOffset anziché 0 per avviare l'animazione dall'offset della barra dell'app corrente.
— bobina

Usare una variabile personalizzata ( -900 )per impostare valueAnimator.setIntValuesLa soluzione migliore è quella di usare- ( appBar.getTotalScrollRange() )
— Ali Rezaiyan il

12

Ho scritto una piccola estensione per AppBarLayout. Permette l'espansione e il collasso di CollapsibleToolbarLayoutentrambi con e senza animazione. Sembra che lo stia facendo nel modo giusto.

Sentiti libero di provarlo.

Basta usarlo al posto tuo AppBarLayoute puoi chiamare i metodi responsabili dell'espansione o del collasso di CollapsingToolbarLayout.

Funziona esattamente come previsto nel mio progetto, ma potrebbe essere necessario modificare i valori fling / scroll nei perform...metodi (specialmente in performExpandingWithAnimation()) per adattarsi perfettamente al tuo CollapsibleToolbarLayout.


@ssdeno, leggi il file Leggimi del contenuto di Github. È obsoleto dalla v23 della libreria di supporto. Dal momento che la v23 del supporto (passando ad AndroidX), esiste un setExpandedmetodo in AppBarLayout.
— Bartek Lipinski,

6

Utilizzare mAppBarLayout.setExpanded(true)per espandere la barra degli strumenti e utilizzare mAppBarLayout.setExpanded(false)per comprimere la barra degli strumenti.

Se si desidera modificare l' altezza di CollapsingToolbarLayout a livello di codice, utilizzare semplicemente mAppBarLayout.setLayoutParams(params);

Espandere:

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

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

Crollo:

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

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

1
Questo mi ha aiutato molto.
— NoName,

1
Questo è molto utile Grazie!
— sunlover3

5

per quelli che vogliono lavorare con onNestedPreScroll e ottenere errori come me. ottengo NullPointerException in onCreate senza questa linea

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

e non funziona correttamente con questo. ma lavoro intorno a questo problema

in onCreate:

        scrollToolbarOnDelay();

e...

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


        }

1

Prova questo...

Espandere

appBarLayout.setExpanded(true, true);

Richiamare

appBarLayout.setExpanded(false, true);

0

Questo può aiutare ad espandere o comprimere:

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);

0

lo sto usando

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

0

Per espandere / comprimere AppBarLayout a livello di codice:

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.