FloatingActionButton no ocultar

Estoy intentando ocultar mi FloatingActionButton fabLocation programación con:

 fabLocation.setVisibility(View.GONE) 

Pero no funciona.

Si agrego android:visibility="gone" en mi diseño XML, fabLocation se oculta cuando ejecuto mi actividad pero reaparece cuando me desplazo.

Aquí está mi diseño:

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:contentScrim="@color/colorOverlay" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:id="@+id/img_couverture" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:scaleType="centerCrop" android:src="@drawable/bg_navigation_drawer_header" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.v7.widget.CardView android:layout_marginTop="8dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" /> <View android:background="@drawable/separator_orange_gradient" android:layout_marginTop="8dp" android:layout_marginBottom="16dp" android:layout_width="match_parent" android:layout_height="2dp"/> <TextView android:id="@+id/tv_history" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.RobotoLight" /> </LinearLayout> </android.support.v7.widget.CardView> </LinearLayout> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:clickable="true" android:id="@+id/fab_location" android:src="@drawable/ic_fab_location_24dp" app:backgroundTint="@color/colorOrange" app:layout_anchor="@id/appbar" app:layout_anchorGravity="bottom|right|end" /> 

12 Solutions collect form web for “FloatingActionButton no ocultar”

Se debe al atributo app:layout_anchor . Debes deshacerte del ancla antes de cambiar la visibilidad:

 CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); p.setAnchorId(View.NO_ID); fab.setLayoutParams(p); fab.setVisibility(View.GONE); 

Si desea mostrar FAB oculto

  <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:fitsSystemWindows="true"> ... </android.support.design.widget.AppBarLayout> ... <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:visibility="gone" android:layout_height="wrap_content" android:layout_width="wrap_content" android:clickable="true"/> </android.support.design.widget.CoordinatorLayout> 

y

  CoordinatorLayout.LayoutParams p = new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.WRAP_CONTENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); p.anchorGravity = Gravity.BOTTOM | Gravity.END; p.setAnchorId(R.id.appbar); p.setMargins(...); fab.setLayoutParams(p); fab.setVisibility(View.VISIBLE); 

Después de algunas respuestas, he fundado la solución para mi problema (también cuando el fab está oculto puede manejar la acción!).

En primer lugar le sugiero que reemplace .setVisibility(View.GONE) y .setVisibility(View.VISIBLE) con los métodos .show() y .hide() . Estos últimos manejan también actionMode .

El segundo problema para mí fue la acción también se manejó cuando el fab estaba oculto, para resolver esto lo hice:

 final CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams)floatingActionButton.getLayoutParams(); if (show){ p.setAnchorId(R.id.appBarLayout); p.width = CoordinatorLayout.LayoutParams.WRAP_CONTENT; p.height = CoordinatorLayout.LayoutParams.WRAP_CONTENT; floatingActionButton.setLayoutParams(p); floatingActionButton.show(); }else{ p.setAnchorId(View.NO_ID); p.width = 0; p.height = 0; floatingActionButton.setLayoutParams(p); floatingActionButton.hide(); } 

FloatingActionButtons anclados a AppBarLayouts tienen una relación especial donde su visibilidad es controlada por la posición de desplazamiento de AppBarLayout.

Puede desactivar esta opción mediante el atributo behavior_autoHide :

 <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_anchor="..." app:behavior_autoHide="false"/> 

También puede hacerlo mediante programación si lo desea:

 FloatingActionButton.Behavior b = (FloatingActionButton.Behavior) fab.getBehavior(); b.setAutoHideEnabled(false); 

No estaba completamente satisfecho con ninguna de las soluciones publicadas. Algunos sólo trabajaban parte del tiempo, mientras que otros sólo trabajaban para fab.setVisibility() . Aunque sé que esto es técnicamente lo que la pregunta original hizo, algunas respuestas expresaron interés en usar fab.hide() , y jugar con los parámetros de diseño no llega exactamente a la raíz del problema.

Como se ha señalado por @ChrisBanes, el FloatingActionButton.Behavior estar vinculado a AppBarLayout es lo que causa el problema. Así pues, como con su respuesta, usted tiene que setAutoHideEnabled(false) para inhabilitar esa funcionalidad. Pero esta solución no ayuda si realmente desea que el FloatingActionButton oculte automáticamente y cuando se llame hide() manualmente.

Así que para hacer esto; Simplemente desactive la funcionalidad de ocultar automáticamente antes de ocultar manualmente el Button y volver a habilitar la funcionalidad después de mostrar manualmente el Button :

 private void hideFloatingActionButton(FloatingActionButton fab) { CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); FloatingActionButton.Behavior behavior = (FloatingActionButton.Behavior) params.getBehavior(); if (behavior != null) { behavior.setAutoHideEnabled(false); } fab.hide(); } private void showFloatingActionButton(FloatingActionButton fab) { fab.show(); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); FloatingActionButton.Behavior behavior = (FloatingActionButton.Behavior) params.getBehavior(); if (behavior != null) { behavior.setAutoHideEnabled(true); } } 

Ninguna de estas otras soluciones me ayudó al 100%. Necesitaba repetir, mostrar animado y ocultar (como FAB.show() y hide() ) todo mientras anclado a la barra de aplicaciones cuando visible.

Terminé creando el FAB nuevo cada vez que lo mostré, insertándolo manualmente y anclándolo, y animándolo basado en la implementación de la biblioteca de soporte. Es asqueroso, pero funciona perfectamente.

 private void hidePlayButton(final FloatingActionButton fab) { // Cancel any animation from the default behavior fab.animate().cancel(); fab.animate() .scaleX(0f) .scaleY(0f) .alpha(0f) .setDuration(200) .setInterpolator(new FastOutLinearInInterpolator()) .setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) {} @Override public void onAnimationEnd(Animator animation) { coordinatorLayout.removeView(fab); } @Override public void onAnimationCancel(Animator animation) {} @Override public void onAnimationRepeat(Animator animation) {} }); } private void showPlayButton() { int fabSize = getResources().getDimensionPixelSize(R.dimen.fab_size); int margin = getResources().getDimensionPixelSize(R.dimen.fab_margin); final FloatingActionButton fab = new FloatingActionButton(getActivity()); fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(getActivity(), R.color.tint))); fab.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.play)); CoordinatorLayout.LayoutParams p = new CoordinatorLayout.LayoutParams(fabSize, fabSize); p.rightMargin = p.leftMargin = p.bottomMargin = p.topMargin = margin; p.anchorGravity = Gravity.BOTTOM | Gravity.END; p.setAnchorId(R.id.appbar); fab.setLayoutParams(p); // Start from 1 pixel fab.setAlpha(0f); fab.setScaleX(0f); fab.setScaleY(0f); binding.coordinatorLayout.addView(fab); fab.animate() .alpha(1f) .scaleX(1f) .scaleY(1f) .setDuration(200) .setInterpolator(new FastOutLinearInInterpolator()); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { hidePlayButton(fab); // do action } }); } 

Código simple:

  public static void setVisibilityFab(FloatingActionButton fab, int visibility) { CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); p.setAnchorId(View.NO_ID); fab.setLayoutParams(p); if(visibility==View.GONE || visibility==View.INVISIBLE) fab.setVisibility(View.GONE); else fab.setVisibility(View.VISIBLE); } 

Sé que su respuesta es acerca de cómo hacer que funcione para la visibilidad gone pero si utiliza invisible en su lugar no tendrá ninguna preocupación por eso y es menos código.

He trabajado alrededor de la falla show () / hide () colocando la FAB en o fuera de la pantalla usando márgenes de diseño. ejemplo:

 CoordinatorLayout.LayoutParams p = new CoordinatorLayout.LayoutParams( CoordinatorLayout.LayoutParams.WRAP_CONTENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); p.gravity = Gravity.BOTTOM | Gravity.LEFT; int fabMargin = (int)res.getDimension(R.dimen.fab_margin); if( enabled ) { p.setMargins(fabMargin,0,0,fabMargin); } else { p.setMargins(-200,0,0,fabMargin); } mFab.setLayoutParams(p); 

Yo utilizo este código:

 boolean mFabShouldBeShown; FloatingActionButton.OnVisibilityChangedListener fabListener = new FloatingActionButton.OnVisibilityChangedListener() { @Override public void onShown(FloatingActionButton fab) { super.onShown(fab); if(!mFabShouldBeShown){ fab.hide(); } } @Override public void onHidden(FloatingActionButton fab) { super.onHidden(fab); if(mFabShouldBeShown){ fab.show(); } } }; public void methodWhereFabIsHidden() { mFabShouldBeShown = false; mFloatingActionButton.hide(fabListener); } public void methodWhereFabIsShown() { mFabShouldBeShown = true; mFloatingActionButton.show(fabListener); } 

La solución real para su problema es subclase por defecto FloatingActionButton.Behavior para llamar a setAutoHide(false) en sus constructores, para que pueda controlarlo usted mismo.

Tenga en cuenta que hablo de las hojas inferiores a continuación, pero es exactamente el mismo problema para todos los botones de acción flotantes anclados y responde a la pregunta y debería resolver el problema como se esperaba.

Alternativamente, puede reemplazar el boolean onDependentViewChanged(…) desde su Comportamiento personalizado, copiar el método estático isBottomSheet(…) presente en la clase FloatingActionButton.Behavior y sólo llamar y devolver el valor del método super si no es una hoja inferior .

Puede personalizar el comportamiento predeterminado de esta manera o extender la clase CoordinatorLayout.Behavior vainilla directamente y puede seleccionar el código de cereza para copiar la pasta de la clase FloatingActionButton.Behavior si es necesario.

Aquí está el código que usé para controlar la visibilidad de FAB:

 /** * Allows controlling the FAB visibility manually. */ @SuppressWarnings("unused") public class FabManualHideBehavior extends FloatingActionButton.Behavior { public FabManualHideBehavior() { super(); setAutoHideEnabled(false); } public FabManualHideBehavior(Context context, AttributeSet attrs) { super(context, attrs); setAutoHideEnabled(false); } } 

Y lo apliqué a mi FAB en xml de esta manera:

 <android.support.design.widget.CoordinatorLayout ...> ... <android.support.design.widget.FloatingActionButton ... app:layout_anchor="@+id/bottom_sheet" app:layout_anchorGravity="top|end" app:layout_behavior="your.package.name.ui.behavior.FabManualHideBehavior"/> </android.support.design.widget.CoordinatorLayout> 

Aquí es una solución simple

 private var fabAnchorId: Int = View.NO_ID private val fabParams: CoordinatorLayout.LayoutParams get() = (fab.layoutParams as CoordinatorLayout.LayoutParams) fun showFab() { fabParams.anchorId = fabAnchorId fabParams.gravity = Gravity.NO_GRAVITY fab.show() } fun hideFab() { fabParams.anchorId = View.NO_ID fabParams.gravity = Gravity.END.or(Gravity.BOTTOM) fab.hide() } 

Antes de mostrar / ocultar tenemos que cambiar el ancla y la gravedad

  • Cómo reparar sombra en FloatingActionButton escalado mediante la biblioteca de soporte 23
  • Cómo integrar un botón de acción flotante en diseño lineal con barra de herramientas
  • FAB - cuadrado en pre Lollipop y sin sombra en Lollipop
  • FloatingActionButton, layout_anchor y layout_gravity
  • Biblioteca de soporte de diseño de Android
  • FloatingActionButton con texto en lugar de imagen
  • Cómo colocar el botón de acción flotante exclusivamente en un fragmento sólo en el diseño de la pestaña
  • Botones de acción flotante desaparecen en el desplazamiento
  • Implementación diferente para un botón de acción flotante en cada fragmento de una actividad
  • Cómo agregar sombra a la FAB proporcionada con la biblioteca de diseño de soporte de Android?
  • Android: animación de detalle dentro de botón de acción flotante
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.