Pregunta simple, pero no puedo encontrar una respuesta. ¿Cómo puedo colapsar o expandir CollapsingToolbarLayoutprogramáticamente?

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

Pregunta simple, pero no puedo encontrar una respuesta. ¿Cómo puedo colapsar o expandir CollapsingToolbarLayoutprogramáticamente?

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

Respuestas:
Usando Support Library v23, puede llamar appBarLayout.setExpanded(true/false).
Lectura adicional: AppBarLayout.setExpanded (boolean)
Yo uso este código para colapsar la barra de herramientas. Todavía no puedo encontrar una manera de expandirlo.
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);
}
}
Edición 1: la misma función con velocidad negativa Y pero la barra de herramientas no está expandida al 100% y falso para el último parámetro debería funcionar
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);
}
}
Edición 2: este código hace el truco para mí
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]);
}
}
Intentaré implementar el comportamiento por mí mismo.
onNestedFlinga false.
onNestedFling antes de configurar el fragmento. Después de configurar el fragmento, podría llamar al método con éxito.
Puede definir cuánto se expande o colapsa con su animador personalizado. Solo usa el setTopAndBottomOffset(int).
Aquí hay un ejemplo:
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 )para establecer valueAnimator.setIntValuesLa mejor solución es usar- ( appBar.getTotalScrollRange() )
He escrito una pequeña extensión para AppBarLayout. Permite la expansión y el colapso de CollapsibleToolbarLayoutambos con y sin animación. Parece estar haciéndolo bien.
Simplemente utilícelo en lugar de su AppBarLayout, y puede llamar a los métodos responsables de expandir o colapsar el CollapsingToolbarLayout.
Funciona exactamente como se esperaba en mi proyecto, pero es posible que deba ajustar los valores de lanzamiento / desplazamiento en los perform...métodos (especialmente en performExpandingWithAnimation()) para que se adapten perfectamente a su CollapsibleToolbarLayout.
setExpandedmétodo en el AppBarLayout.
Use mAppBarLayout.setExpanded(true)para expandir la barra de herramientas y usemAppBarLayout.setExpanded(false) para contraer la Barra de herramientas.
Si desea cambiar la altura de CollapsingToolbarLayout mediante programación, simplemente use mAppBarLayout.setLayoutParams(params);
Expandir:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Colapso:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
para aquellos que quieren trabajar con onNestedPreScroll y obtener un error como yo. me sale NullPointerException en onCreate sin esta línea
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
y no funciona correctamente con esto. pero evito este problema con
en onCreate:
scrollToolbarOnDelay();
y...
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);
}
Prueba esto...
Expandir
appBarLayout.setExpanded(true, true);
Para recordar
appBarLayout.setExpanded(false, true);
Esto puede ayudar a expandir o colapsar:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);