nsL*_*nsL 10 android android-recyclerview android-collapsingtoolbarlayout
我想在nestedscrollview中发生滚动/触摸事件时,只在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
Run Code Online (Sandbox Code Playgroud)
我尝试为CollapsingToolbarLayout/AppBarLayout覆盖onTouch()和onInterceptTouchEvent(),但它会一直拦截触摸事件/滚动.
nsL*_*nsL 28
好的,我找到了解决方案.
您只需要在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;
}
});
Run Code Online (Sandbox Code Playgroud)
解决方案来自: 如何禁用在CoordinatorLayout中滚动AppBarLayout?
如果由于null行为而遇到NullPointerException,则应首先分配一个:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppbar.getLayoutParams();
params.setBehavior(new AppBarLayout.Behavior());
Run Code Online (Sandbox Code Playgroud)
我为 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
}
Run Code Online (Sandbox Code Playgroud)
您可以在数据绑定布局中使用它,如下所示:
<com.google.android.material.appbar.AppBarLayout
...
app:scrollable="@{true/false}"
... >
...
</com.google.android.material.appbar.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)
就我而言,我还想禁用 NestedScrollView 上的滚动,这就是我编写第二个 BindingAdapter 的原因:
@BindingAdapter("scrollable")
fun setScrollable(nestedScrollView: NestedScrollView, scrollable: Boolean) {
nestedScrollView.setOnTouchListener { _, _ -> !scrollable }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7163 次 |
| 最近记录: |