【问题标题】:Disable vertical scroll in CollapsingToolbarLayout / AppBarLayout在 CollapsingToolbarLayout / AppBarLayout 中禁用垂直滚动
【发布时间】:2017-04-06 14:37:13
【问题描述】:

我只希望在嵌套滚动视图中发生滚动/触摸事件时在 CollapsingToolbarLayout / AppBarLayout 上垂直滚动(这是有效的),但如果用户尝试直接滚动 CollapsingToolbarLayout / AppBarLayout 它不应该工作。我需要这个,因为那里的滚动/触摸事件会干扰我的 recyclerview 滚动事件。

我有这个结构:

CoordinatorLayout

-- AppBarLayout

---- CollapsingToolbarLayout (scrollflags: scroll, exitUntilCollapsed, snap)

------ Toolbar (CollapseMode: pin)

------ RecyclerView (Horizontal, CollapseMode: pin)

----- /CollapsingToolbarLayout

-- /AppBarLayout

-- NestedScrollView (Behaviour: appbar_scrolling_view_behavior)

-- /NestedScrollView

/ CoordinatorLayout

我尝试为 CollapsingToolbarLayout / AppBarLayout 覆盖 onTouch() 和 onInterceptTouchEvent() 但它一直在拦截触摸事件/滚动。

【问题讨论】:

    标签: android android-recyclerview android-collapsingtoolbarlayout


    【解决方案1】:

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

    您只需在 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 Behavior 而遇到 NullPointerException,你应该先分配一个:

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

    【讨论】:

    • 谢谢。这可行,但我仍然有方向变化的问题。这也是你看到的吗?
    【解决方案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 }
    }
    

    【讨论】:

      【解决方案3】:

      如果您设置了任何app:layout_scrollFlags(下面的示例)- 删除它们。

      app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
      

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 2011-07-03
        • 2020-12-01
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        相关资源
        最近更新 更多