I am working on app in some fragment i want to hide FloatingActionButtton. When i set android:visibility="gone". Behavior animation show me FloatingActionButtton when i swipe up and down. is there is any way i can disable/enable FloatingActionButtton behavior.
Thank you advance.
here is my code
QuickReturnFooterBehavior.java
package com.app.common;
import android.animation.Animator;
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewPropertyAnimator;
@SuppressWarnings("unused")
public class QuickReturnFooterBehavior extends     CoordinatorLayout.Behavior<View> {
private static final FastOutSlowInInterpolator INTERPOLATOR = new FastOutSlowInInterpolator();
private int mDySinceDirectionChange;
private boolean mIsShowing;
private boolean mIsHiding;
public QuickReturnFooterBehavior() {
}
public QuickReturnFooterBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
    return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
    if (dy > 0 && mDySinceDirectionChange < 0
            || dy < 0 && mDySinceDirectionChange > 0) {
        // We detected a direction change- cancel existing animations and reset our cumulative delta Y
        child.animate().cancel();
        mDySinceDirectionChange = 0;
    }
    mDySinceDirectionChange += dy;
    if (mDySinceDirectionChange > child.getHeight()
            && child.getVisibility() == View.VISIBLE
            && !mIsHiding) {
        hide(child);
    } else if (mDySinceDirectionChange < 0
            && child.getVisibility() == View.GONE
            && !mIsShowing) {
        show(child);
    }
}
/**
 * Hide the quick return view.
 *
 * Animates hiding the view, with the view sliding down and out of the screen.
 * After the view has disappeared, its visibility will change to GONE.
 *
 * @param view The quick return view
 */
private void hide(final View view) {
    mIsHiding = true;
    ViewPropertyAnimator animator = view.animate()
            .translationY(view.getHeight())
            .setInterpolator(INTERPOLATOR)
            .setDuration(200);
    animator.setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {}
        @Override
        public void onAnimationEnd(Animator animator) {
            // Prevent drawing the View after it is gone
            mIsHiding = false;
            view.setVisibility(View.GONE);
        }
        @Override
        public void onAnimationCancel(Animator animator) {
            // Canceling a hide should show the view
            mIsHiding = false;
            if (!mIsShowing) {
                show(view);
            }
        }
        @Override
        public void onAnimationRepeat(Animator animator) {}
    });
    animator.start();
}
/**
 * Show the quick return view.
 *
 * Animates showing the view, with the view sliding up from the bottom of the screen.
 * After the view has reappeared, its visibility will change to VISIBLE.
 *
 * @param view The quick return view
 */
private void show(final View view) {
    mIsShowing = true;
    ViewPropertyAnimator animator = view.animate()
            .translationY(0)
            .setInterpolator(INTERPOLATOR)
            .setDuration(200);
    animator.setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {
            view.setVisibility(View.VISIBLE);
        }
        @Override
        public void onAnimationEnd(Animator animator) {
            mIsShowing = false;
        }
        @Override
        public void onAnimationCancel(Animator animator) {
            // Canceling a show should hide the view
            mIsShowing = false;
            if (!mIsHiding) {
                hide(view);
            }
        }
        @Override
        public void onAnimationRepeat(Animator animator) {}
    });
    animator.start();
  }
 }
and XML
   <android.support.design.widget.FloatingActionButton
    app:layout_behavior="com.app.common.QuickReturnFooterBehavior"
    android:id="@+id/fab_2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:src="@drawable/ic_action_quick_response_code"
    app:backgroundTint="@color/text_gray"
    app:descriptionText="@string/add_friend"
    app:elevation="3dp"
    app:borderWidth="0dp"
    />
                There is no difference while setting up the visibility of a FAB, it works likely other controls.
0 is for VISIBLE
4 is for INVISIBLE
8 is for GONE
You can try something this;
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
// to make is disable for some requirement 
fab.setVisibility(View.GONE);
// to make it enable 
fab.setVisibility(View.VISIBLE);
                        Finally I find it solution and I want to share with you.
You can enable/disable FloatingActionButton Behavior
Disable Behavior
    FloatingActionButton fab2 = (FloatingActionButton)findViewById(R.id.fab2);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab2.getLayoutParams();
    params.setBehavior(null);
    fab2.requestLayout();
    fab2.setVisibility(View.GONE);
Enable Behavior
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab2.getLayoutParams();
    params.setBehavior(new QuickReturnFooterBehavior());
    fab2.requestLayout();
    fab2.setVisibility(View.VISIBLE);
Edited: More Reusable Class
public class CoordinateBehaviourUtils {
  public static void enableDisableViewBehaviour(View view,CoordinatorLayout.Behavior<View> behavior,boolean enable){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
    params.setBehavior(behavior);
    view.requestLayout();
    view.setVisibility((enable ? View.VISIBLE: View.GONE));
  }
}
How To Enable Using Common Class
FloatingActionButton fab2 = (FloatingActionButton)findViewById(R.id.fab2);
CoordinateBehaviourUtils.enableDisableViewBehaviour(fab2,new QuickReturnFooterBehavior(),true);
How To Disable Using Common Class
FloatingActionButton fab2 = (FloatingActionButton)findViewById(R.id.fab2);
CoordinateBehaviourUtils.enableDisableViewBehaviour(fab2,null,false);
Hope it will solve your problem :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With