Pregunta simple, pero no puedo encontrar una respuesta. ¿Cómo puedo colapsar o expandir CollapsingToolbarLayout
programáticamente?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Pregunta simple, pero no puedo encontrar una respuesta. ¿Cómo puedo colapsar o expandir CollapsingToolbarLayout
programá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.
onNestedFling
a 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.setIntValues
La mejor solución es usar- ( appBar.getTotalScrollRange() )
He escrito una pequeña extensión para AppBarLayout
. Permite la expansión y el colapso de CollapsibleToolbarLayout
ambos 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
.
setExpanded
mé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);