Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在折叠工具栏布局/AppBarLayout中禁用垂直滚动_Android_Android Recyclerview_Android Collapsingtoolbarlayout - Fatal编程技术网

Android 在折叠工具栏布局/AppBarLayout中禁用垂直滚动

Android 在折叠工具栏布局/AppBarLayout中禁用垂直滚动,android,android-recyclerview,android-collapsingtoolbarlayout,Android,Android Recyclerview,Android Collapsingtoolbarlayout,我希望只有在nestedscrollview中发生滚动/触摸事件时,才在Collayout/AppBarLayout上进行垂直滚动(此操作正常),但如果用户尝试直接滚动Collayout/AppBarLayout,则不应工作。我需要这个,因为那里的滚动/触摸事件与我的recyclerview滚动事件发生了冲突 我有这样的结构: CoordinatorLayout -- AppBarLayout ---- CollapsingToolbarLayout (scrollflags: scroll

我希望只有在nestedscrollview中发生滚动/触摸事件时,才在Collayout/AppBarLayout上进行垂直滚动(此操作正常),但如果用户尝试直接滚动Collayout/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

我尝试对正在折叠的ToolbarLayout/AppBarLayout覆盖onTouch()和onInterceptTouchEvent(),但它一直拦截触摸事件/滚动。

好的,我找到了解决方案

您只需覆盖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;
    }
});
解决方案如下:

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

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

我为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>

如果您设置了任何
app:layout\u scrollFlags
(下面的示例)-删除它们

app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"

非常感谢。这是可行的,但我在方向改变方面仍然存在问题。这也是你看到的吗?
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"