2016-11-22 306 views
6

我想只在滚动/触摸事件发生在nestedscrollview(这是工作)时,CollapsingToolbarLayout/AppBarLayout上的垂直滚动,但如果用户试图直接滚动CollapsingToolbarLayout/AppBarLayout它不应该工作。我需要这个,因为那里的滚动/触摸事件与我的recyclerview滚动事件有关。在CollapsingToolbarLayout/AppBarLayout中禁用垂直滚动

我有这样的结构:

CoordinatorLayout 

-- AppBarLayout 

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

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

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

----- /CollapsingToolbarLayout 

-- /AppBarLayout 

-- NestedScrollView (Behaviour: appbar_scrolling_view_behavior) 

-- /NestedScrollView 

/CoordinatorLayout 

我试图重写onTouch()和onInterceptTouchEvent()两个CollapsingToolbarLayout/AppBarLayout但它一直拦截触摸事件/滚动。

回答

13

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

您只需重写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?

如果您遇到NullPointerException异常,因为一个空的行为,你应该指定一个第一:

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

谢谢。这工作,但我仍然有方向变化的问题。这是你看到的吗? –

+0

谢谢! 10000000谢谢!这真的很有用! )))))) – maXp