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.