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

Ale*_*niy 33 android ontouchlistener android-viewpager

范围

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

问题

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

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

ale*_*dev 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 两个注意事项:1.您不必继续引用寻呼机 - 调用`getParent().request ...`就足够了,父节点将传播请求.它使在自定义视图中使用更加灵活.起初我以为在启动时为视图调用"请求......"就足够了.似乎必须为每个触摸事件调用它.这就是你必须要做的事情`onTouch()`@ dev_android (5认同)
  • 这只适用于onTouch吗?我在onScale上尝试了这个,但它仍在拦截我的触摸. (2认同)

Kuf*_*ffs 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);
    }
}
Run Code Online (Sandbox Code Playgroud)