SuperBale
SuperBale

Reputation: 351

Keep CollapsingToolbarLayout permanently closed, only control programatically

I want to only have the CollapsingToolbarLayout expand programmatically.

I came across this: https://code.luasoftware.com/tutorials/android/how-to-disable-or-lock-collapsingtoolbarlayout-collapse-or-expand/

It works. But, I want to keep the RecyclerView Touch events still active as I have a FAB in a Coordinator Layout.

Is this possible?

Upvotes: 1

Views: 82

Answers (1)

MidasLefko
MidasLefko

Reputation: 4559

I don't remember where I got this from but it works great for me. Its a custom Behavior for AppBarLayout's:

public class LockableAppBarLayoutBehavior extends AppBarLayout.Behavior {

    boolean locked;
    private DragCallback dragCallBack = new DragCallback() {
        @Override
        public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
            return !locked;
        }
    };

    public LockableAppBarLayoutBehavior() {
        setDragCallback(dragCallBack);
    }

    public LockableAppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        setDragCallback(dragCallBack);
    }

    public void setLocked(boolean locked) {
        this.locked = locked;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) {
        if (locked) {
            return false;
        }

        return super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type);
    }

    public boolean isLocked() {
        return locked;
    }
}

Easiest usage is in your layout xml:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    app:layout_behavior="path.to.the.class.LockableAppBarLayoutBehavior"
    >

Last, here's how you lock and unlock in code:

CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
LockableAppBarLayoutBehavior behavior = (LockableAppBarLayoutBehavior) layoutParams.getBehavior();
behavior.setLocked(true);

Upvotes: 1

Related Questions