Disable vertical scroll in CollapsingToolbarLayout / AppBarLayout

前端 未结 3 714
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-05 17:55

I would like the vertical scroll on the CollapsingToolbarLayout / AppBarLayout ONLY when the scroll/touch event occurs in the nestedscrollview (this is working), but if the user

相关标签:
3条回答
  • 2021-02-05 18:04

    I wrote a BindingAdapter for nsL's answer:

    @BindingAdapter("scrollable")
    fun setScrollable(appBarLayout: AppBarLayout, scrollable: Boolean) {
        val layoutParams = appBarLayout.layoutParams as CoordinatorLayout.LayoutParams
        val behavior = (layoutParams.behavior as? AppBarLayout.Behavior) ?: AppBarLayout.Behavior()
        behavior.setDragCallback(object : AppBarLayout.Behavior.DragCallback() {
            override fun canDrag(appBarLayout: AppBarLayout): Boolean = scrollable
        })
        layoutParams.behavior = behavior
    }
    

    You can use it in a databinding layout like this:

    <com.google.android.material.appbar.AppBarLayout
        ...
        app:scrollable="@{true/false}"
        ... >
    ...
    </com.google.android.material.appbar.AppBarLayout>
    

    In my case I also wanted to disable the scroll on the NestedScrollView, which is why I wrote a second BindingAdapter:

    @BindingAdapter("scrollable")
    fun setScrollable(nestedScrollView: NestedScrollView, scrollable: Boolean) {
        nestedScrollView.setOnTouchListener { _, _ -> !scrollable }
    }
    
    0 讨论(0)
  • 2021-02-05 18:12

    If you have set any of app:layout_scrollFlags (example below) - delete them.

    app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
    
    0 讨论(0)
  • 2021-02-05 18:19

    Ok, i found out the solution for this.

    You just have to override the onDrag() method in the AppBarLayout behaviour and the scroll wont be triggered if the touch occurs on top of the AppBarLayout view.

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
    behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
        @Override
        public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
            return false;
        }
    });
    

    Solution from here: How to disable scrolling of AppBarLayout in CoordinatorLayout?

    If you run into NullPointerException because of a null Behavior, you should assign one first:

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppbar.getLayoutParams();
    params.setBehavior(new AppBarLayout.Behavior());
    
    0 讨论(0)
提交回复
热议问题