解决两个ViewPager的冲突事件

情景还原:

这里写图片描述

一种方法是在内部ViewPager调用时设置点击侦听。
不过这个方法有一个bug,就是快速滑动内部ViewPager时此方法可能来不及调用,事件直接返回给了外部ViewPager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//对子view实现setOnTouchListener(new ...)监听,在onTouch()方法里,进行拦截。
// 调用当前子view的onInterceptTouchEvent()方法。
viewpager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
(v.getParent()).requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
(v.getParent()).requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});

另一种方法是重写外部ViewPager的canScroll方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ParentViewPager extends ViewPager{

public ParentViewPager(Context context) {
super(context);
}

public ParentViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v != this && v instanceof ViewPager) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
}

这里我用的是第二种方法,改善后为:

这里写图片描述