25.1.0 La librería de soporte de Android está rompiendo el comportamiento fabuloso
Actualizo a la última versión de la biblioteca de soporte y el comportamiento de desplazamiento FAB no funciona. Cuando se desplaza hacia abajo en un RecyclerView se desplaza correctamente hacia abajo, pero al desplazarse hacia arriba de nuevo no lo es. Queda oculto. La degradación a 25.0.1 parece mitigar este problema. Para referencia aquí es el código que uso para esto.
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" android:fitsSystemWindows="true" tools:context=".mainhost.MainActivity" tools:openDrawer="start"> <android.support.design.widget.CoordinatorLayout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main_coordinator_layout_root_view" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainhost.MainActivity"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways|snap"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:focusableInTouchMode="true" app:layout_collapseMode="pin" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <!-- Layout for content is here. This can be a RelativeLayout --> <FrameLayout android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="-3dp" android:layout_marginRight="-3dp" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.globyworks.citykey.mainhost.MainActivity" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" app:layout_behavior="com.globyworks.citykey.helpers.ScrollingFABBehavior" android:src="@drawable/drawer_new_report_white" /> </android.support.design.widget.CoordinatorLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/white" app:menu="@menu/menu_drawer"> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>
Y la clase de desplazamiento:
- Android - FAB para ocultar al navegar entre diferentes fragmentos en un viewpager
- Uso de Google Design Library como ocultar el botón FAB en Desplazamiento hacia abajo?
- ¿Cómo agregar texto al botón de acción flotante?
- Implementación del menú de acción flotante mediante el botón de acción Float de Android Design Support library
- Bug con FloatingActionButton anclado en la biblioteca de soporte 24.2.1
public class ScrollingFABBehavior extends FloatingActionButton.Behavior { public ScrollingFABBehavior(Context context, AttributeSet attrs) { super(); } public boolean onStartNestedScroll(CoordinatorLayout parent, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { return true; } @Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { if (dependency instanceof RecyclerView) { return true; } return false; } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed ); if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { child.hide(); } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { child.show(); } } }
- Recyclerview exterior no recibe eventos de desplazamiento de Recyclerview interno
- Cómo cambiar el diseño de android biblioteca de soporte FAB Button color de la frontera?
- Diseño de soporte para Android elevación del botón de acción flotante no visible para los colores distintos del blanco
- Botón de acción flotante Ser un cuadrado
- Android: cambiar dinámicamente el icono FAB (botón de acción flotante) del código
- Botón de acción flotante que no se muestra sobre la vista de reciclaje (que se encuentra dentro de un DrawerLayout)
- Android: FloatingActionButton no se pudo instanciar
- No puedo eliminar el valor predeterminado de FloatingActionButton en una actividad de Gaveta de navegación
Actualmente CoordinatorLayout está omitiendo las vistas establecidas en GONE
al buscar comportamientos para llamar en su método onNestedScroll
.
Una solución rápida aquí es establecer la visibilidad de FAB a INVISIBLE
al final de la animación de ocultar FAB .
if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { child.hide(new FloatingActionButton.OnVisibilityChangedListener() { @Override public void onHidden(FloatingActionButton fab) { super.onHidden(fab); fab.setVisibility(View.INVISIBLE); } }); } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { child.show(); }
La costumbre anterior OnVisibilityChangedListener era sólo una parte de la solución para mí. Con la actualización configurando el fab en INVISIBLE, también es necesario actualizar la condición else if en la anulación onNestedScroll () para probar ahora que la visibilidad sea INVISIBLE, en lugar de GONE:
@Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); if(dyConsumed > 0 && child.getVisibility() == View.VISIBLE){ child.hide(new FloatingActionButton.OnVisibilityChangedListener() { @Override public void onHidden(FloatingActionButton fab) { super.onHidden(fab); fab.setVisibility(View.INVISIBLE); } }); } else if(dyConsumed < 0 && child.getVisibility() == View.INVISIBLE){ child.show(); } }
Tengo un poco del mismo problema con el tabview (después de aumentar a 25.1.0) Muestra la primera vez, pero la segunda vez (después de repoblar) llega a ser invisible.