2015-11-03 83 views
2

范围Viewpager拦截小吃吧解雇

我有一个包含ViewPager片段。 viewpager的每个页面都包含一个项目片段。当我对物品片段采取行动时,我会在物品片段中显示一个小吃棒。快餐栏是项目片段的一部分(CoordinatorLayout是项目片段布局的一部分)。

问题

我现在面临的问题是,我是不允许的,因为viewpager拦截刷卡事件并更改页面,而不是让小吃吧获得驳回驳回小吃吧。

问题

我想viewpager不拦截倒是小吃吧,但还是拦截倒是项目片段的剩余部分(用户应该还是可以左右滑动来翻页不刷卡时在小吃店)。有谁知道一种方法来做到这一点?

我已经创建了一个示例应用程序来演示该问题。它可在https://github.com/gfrederick/ViewPagerSnackbar

+0

我遇到了同样的问题,另外,如果我滚动左/右的小吃吧滚出页面。我不知道这是否会帮助你给出你的场景,但是我最终做的是将快餐栏放在有viewpager的布局中,而不是内部片段的布局。然后我发回了一个消息给拿着视图寻呼机的片段,并从那里发起了快餐栏。我现在可以解除它,它不会与寻呼机滚动,这正是我想要的。希望有所帮助! – Ben987654

+0

谢谢。我最初尝试了这种方法,但我试图在ViewPager中保留它所属的片段。如果用户在ViewPager中滑动片段,我想让快餐栏与片段一起滑动。 – GFred

回答

2

看看我的解决方案github

如果由于某种原因链接被删除,我会解释我做了什么。

  1. 我将相关的Snackbar类复制到我的项目中。
  2. 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; 
    } 
} 
+0

完美地工作。谢谢! – GFred

+0

Np。我用android打开了一个[bug](https://code.google.com/p/android/issues/detail?id=198230)。 – MidasLefko