android - tutorial - Detectar cuándo se ha expandido completamente AppBarLayout/CollapsingToolbarLayout
material design collapsing toolbar (3)
Mi solución se basa en crear una vista personalizada. Primero crea una clase extendiendo el AppBarLayout nativo:
public class CustomAppBar extends AppBarLayout { ....
Luego, dentro de la clase, establezca un addOnOffsetChangedListener como este:
this.addOnOffsetChangedListener...
Puede hacer lo anterior estableciendo en el constructor o tal vez llamando a un método dentro del constructor. Entonces necesitas el constructor, recuerda usar el constructor con 2 parámetros para poder agregarlo al xml :
public CustomAppBar(Context context, AttributeSet attrs) {
super(context, attrs);
//You can set the listener here or maybe call the method that set the listener
}
Luego tenemos que obtener acceso al estado de la vista, así que cree un booleano privado dentro de su clase de vista personalizada y configúrelo en verdadero o falso si su vista comienza a expandirse o colapsar, en este caso mi vista se expandirá por defecto:
private boolean isExpanded = true;
Ahora tienes que actualizar el estado de ese booleano:
this.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset == 0) {
isExpanded = true;
} else {
isExpanded = false;
}
}
});
El siguiente paso es obtener el estado del booleano utilizando un getter dentro de la clase CustomAppBar
public boolean isExpanded() {
return isExpanded;
}
El siguiente es ir a su xml, usar su vista personalizada allí, luego en la actividad o Fragmento obtener la vista y usar el método para conocer el estado de la barra de aplicaciones
Tengo un fragmento que utiliza el nuevo paradigma CoordinatorLayout / AppBarLayout / CollapsingToolbarLayout, y me gustaría poder detectar cuándo la barra de herramientas colapsada está completamente expandida para poder realizar una operación en todo el fragmento en el que está, por ejemplo, haciendo estallar el fragmento. De la pila y yendo a uno nuevo, descartando el fragmento. Tengo el código de salida funcionando, solo necesito saber cuándo y cuándo no usarlo.
He experimentado un poco con AppBarLayout.OnOffsetChangedListener , pero no tuve mucha suerte. ¿Hay alguna forma de usarlo para determinar cuándo las cosas están completamente expandidas, o existe un método preferido que alguien conozca?
¡Gracias por adelantado!
EDITAR: También veo que hay un par de implementaciones para AppBarLayout.setExpanded(...) , sin embargo, no AppBarLayout.getExpanded () o algo similar, por lo que también estoy perplejo.
No parece que haya nada en las API, pero lo siguiente parece estar funcionando para mí. Puede que necesite pruebas.
boolean fullyExpanded =
(appBarLayout.getHeight() - appBarLayout.getBottom()) == 0;
Edición: la solución anterior parece funcionar, pero como quería probar esta condición cuando se desplazó la barra de aplicaciones, terminé usando la siguiente solución con OnOffsetChangedListener
.
class Frag extends Fragment implements AppBarLayout.OnOffsetChangedListener {
private boolean appBarIsExpanded = true;
private AppBarLayout appBarLayout;
@Override
public void onActivityCreated(Bundle state) {
super.onActivityCreated(state);
appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar);
}
@Override
public void onResume() {
super.onResume();
appBarLayout.addOnOffsetChangedListener(this);
}
@Override
public void onStop() {
super.onStop();
appBarLayout.removeOnOffsetChangedListener(this);
}
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
appBarIsExpanded = (verticalOffset == 0);
}
}
Sé que tal vez sea un poco tarde, pero explorando el código fuente del AppBArLayout que he encontrado, el AppBarLayout.OnOffsetChangedListener simplemente traduce el valor del int getTopAndBottomOffset () del Comportamiento de la AppBar.
Entonces, en cualquier momento, solo puede usar este código para definir si un AppBarLayout se expandió o no:
public boolean isAppBArExpanded(AppBarLayout abl) {
final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior();
return (behavior instanceof AppBarLayout.Behavior) ? (((AppBarLayout.Behavior) behavior).getTopAndBottomOffset() == 0) : false;
}