Domanda semplice, ma non riesco a trovare una risposta. Come posso comprimere o espandere a livello di CollapsingToolbarLayout
codice?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Domanda semplice, ma non riesco a trovare una risposta. Come posso comprimere o espandere a livello di CollapsingToolbarLayout
codice?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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.
onNestedFling
a 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.setIntValues
La soluzione migliore è quella di usare- ( appBar.getTotalScrollRange() )
Ho scritto una piccola estensione per AppBarLayout
. Permette l'espansione e il collasso di CollapsibleToolbarLayout
entrambi con e senza animazione. Sembra che lo stia facendo nel modo giusto.
Basta usarlo al posto tuo AppBarLayout
e 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
.
setExpanded
metodo 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);