ViewPager拦截所有x轴onTouch事件。如何禁用?

时间:2011-11-14 13:42:10

标签: android ontouchlistener android-viewpager

范围

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

问题

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

问题

覆盖viewpager的行为以使其和我的布局协同工作是否真实?因此,完美的情况是布局拦截其上的所有onTouch事件,viewpager管理其余的onTouch事件。谢谢!

4 个答案:

答案 0 :(得分:42)

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

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;
    }
}

答案 1 :(得分:19)

类似的情况(但不使用ViewPager),将此放在需要触摸事件的视图中。如果适用于您的用例,请添加ACTION_MOVE以外的MotionEvent检查。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return true;
    } else {
        return super.onTouchEvent(event);
    }
}

答案 2 :(得分:0)

中微子是对的!

Countable

一旦viewpager访问touchEvent Intercept,其中的子视图就可以获得该事件。 enter image description here


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

答案 3 :(得分:-1)

我遇到了类似的问题。

就我而言,我在OnTouchListener上设置了ViewPager,但是当接触触摸的孩子设置了onClick时,它没有收到触摸事件。

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