34

范围

有两个片段的viewpager。其中一个片段有一个布局,女巫监听 X 轴上的 onTouch 变化。

问题

布局在沿 X 轴触摸和滑动时几乎不会获得所有 Action.Move 事件。viewpager 似乎有一个返回 true 的 onInterceptTouchEvent。

问题

覆盖 viewpager 的行为以使其和我的布局一起工作是真的吗?所以完美的情况是 layout 拦截了它上面的所有 onTouch 事件,而 viewpager 管理其余的 onTouch 事件。谢谢!

4

4 回答 4

43

你是对的,我相信每个滚动容器都会拦截触摸事件,但你可以阻止它。您可以在布局上放置一个触摸监听器:

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_MOVE: 
        pager.requestDisallowInterceptTouchEvent(true);
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        pager.requestDisallowInterceptTouchEvent(false);
        break;
    }
}
于 2011-11-14T14:01:02.600 回答
19

类似的情况(但不使用 ViewPager),将它放在需要触摸事件的视图中对我有用。添加对 MotionEvents 的检查(ACTION_MOVE如果适用于您的用例)。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return true;
    } else {
        return super.onTouchEvent(event);
    }
}
于 2011-11-14T13:57:51.187 回答
1

中微子是对的!

getParent().requestDisallowInterceptTouchEvent(true);

一旦 viewpager 访问 touchEvent 拦截,其中的子视图就可以获得事件。 在此处输入图像描述


我在 viewpager 中使用 FrameLayout 来获得 DrawerLayout 效果(我需要它与屏幕的高度不匹配,所以我不能使用抽屉布局或导航抽屉)。
这真的很有帮助!

于 2015-10-09T07:38:24.583 回答
-1

我有一个类似的问题。

在我的情况下,我设置了一个OnTouchListenerViewPager但是当接收到触摸的孩子设置时它没有接收到触摸事件onClick

我所做的是扩展 ViewPager 类并在方法内调用我的点击侦听器onInterceptTouchEvent(boolean),它工作正常。请注意不要拦截错误的事件。

于 2013-01-25T16:09:20.177 回答