Search code examples
androidandroid-layoutandroid-recyclerviewandroid-coordinatorlayoutandroid-collapsingtoolbarlayout

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?


Solution

  • 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);