我希望在nestedscrollview中发生滚动/触摸事件时,只在CollapsingToolbarLayout / AppBarLayout上进行垂直滚动(这是有效的),但是如果用户尝试直接滚动CollapsingToolbarLayout / AppBarLayout,它应该不起作用。我需要这个,因为那里的滚动/触摸事件搞乱了我的recyclerview滚动事件。
我有这个结构:
created_at
我尝试为CollapsingToolbarLayout / AppBarLayout重写onTouch()和onInterceptTouchEvent(),但它会一直拦截触摸事件/滚动。
答案 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"