在CollapsingToolbarLayout / AppBarLayout中禁用垂直滚动

时间:2016-11-22 19:21:59

标签: android android-recyclerview android-collapsingtoolbarlayout

我希望在nestedscrollview中发生滚动/触摸事件时,只在CollapsingToolbarLayout / AppBarLayout上进行垂直滚动(这是有效的),但是如果用户尝试直接滚动CollapsingToolbarLayout / AppBarLayout,它应该不起作用。我需要这个,因为那里的滚动/触摸事件搞乱了我的recyclerview滚动事件。

我有这个结构:

created_at

我尝试为CollapsingToolbarLayout / AppBarLayout重写onTouch()和onInterceptTouchEvent(),但它会一直拦截触摸事件/滚动。

3 个答案:

答案 0 :(得分:26)

好的,我找到了解决方案。

您只需覆盖AppBarLayout行为中的onDrag()方法,如果触摸发生在AppBarLayout视图的顶部,则不会触发滚动。

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

此处的解决方案: How to disable scrolling of AppBarLayout in CoordinatorLayout?

如果由于null行为而遇到NullPointerException,则应首先指定一个:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppbar.getLayoutParams();
params.setBehavior(new AppBarLayout.Behavior());

答案 1 :(得分:2)

我为nsL的答案写了一个BindingAdapter:

@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
}

您可以在这样的数据绑定布局中使用它:

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

就我而言,我还想禁用NestedScrollView上的滚动,这就是为什么我编写了第二个BindingAdapter的原因:

@BindingAdapter("scrollable")
fun setScrollable(nestedScrollView: NestedScrollView, scrollable: Boolean) {
    nestedScrollView.setOnTouchListener { _, _ -> !scrollable }
}

答案 2 :(得分:0)

如果您设置了app:layout_scrollFlags(以下示例)中的任何一个,请删除它们。

app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"