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

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

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

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

Risposte:
Utilizzando Support Library v23, è possibile chiamare appBarLayout.setExpanded(true/false).
Ulteriori letture: AppBarLayout.setExpanded (booleano)
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]);
}
}
Cercherò di attuare il comportamento da solo.
onNestedFlinga false.
onNestedFling prima di impostare il frammento. Dopo aver impostato il frammento, ho potuto chiamare il metodo con successo.
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();
}
( -900 )per impostare valueAnimator.setIntValuesLa soluzione migliore è quella di usare- ( appBar.getTotalScrollRange() )
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.
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.
setExpandedmetodo in AppBarLayout.
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);
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);
}
Prova questo...
Espandere
appBarLayout.setExpanded(true, true);
Richiamare
appBarLayout.setExpanded(false, true);
Questo può aiutare ad espandere o comprimere:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);