看看我的解决方案github。
如果由于某种原因链接被删除,我会解释我做了什么。
- 我将相关的Snackbar类复制到我的项目中。
- 受this answer的启发,我修改了Snackbar的Behavior子类以在viewpager中工作。具体来说,我发现视图层次结构中是否有viewpager作为快餐栏的父级。然后,当触摸小吃店时,我禁用该视图页面处理触摸事件。当放开小吃店时(触摸事件结束时),我可以重新启用它。
这里的重要代码:
final class Behavior extends SwipeDismissBehavior<SnackbarLayout> {
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, SnackbarLayout child,
MotionEvent event) {
ViewPager vp = getViewPagerParent(child);
if (parent.isPointInChildBounds(child, (int) event.getX(), (int) event.getY())) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
ViewPagerSnackbarManager.getInstance().cancelTimeout(mManagerCallback);
// If touching Snackbar tell the viewpager not to intercept touch events
if (vp != null) {
vp.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// As soon as this event (touching the Snackbar) is over tell viewpager to resume intercepting touch events
if (vp != null) {
vp.requestDisallowInterceptTouchEvent(false);
}
ViewPagerSnackbarManager.getInstance().restoreTimeout(mManagerCallback);
break;
}
}
return super.onInterceptTouchEvent(parent, child, event);
}
// helper method that move up the view hierarchy searching for a Viewpager and returns it if found. Null if not found.
private ViewPager getViewPagerParent(View child) {
ViewParent parent = child.getParent();
while (parent != null) {
parent = child.getParent();
if (parent instanceof ViewPager) {
return (ViewPager) parent;
} else if (!(parent instanceof View)) {
return null;
} else {
child = (View) parent;
}
}
return null;
}
}
我遇到了同样的问题,另外,如果我滚动左/右的小吃吧滚出页面。我不知道这是否会帮助你给出你的场景,但是我最终做的是将快餐栏放在有viewpager的布局中,而不是内部片段的布局。然后我发回了一个消息给拿着视图寻呼机的片段,并从那里发起了快餐栏。我现在可以解除它,它不会与寻呼机滚动,这正是我想要的。希望有所帮助! – Ben987654
谢谢。我最初尝试了这种方法,但我试图在ViewPager中保留它所属的片段。如果用户在ViewPager中滑动片段,我想让快餐栏与片段一起滑动。 – GFred