情景还原:
一种方法是在内部ViewPager调用时设置点击侦听。
不过这个方法有一个bug,就是快速滑动内部ViewPager时此方法可能来不及调用,事件直接返回给了外部ViewPager1
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() {
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
18public class ParentViewPager extends ViewPager{
public ParentViewPager(Context context) {
super(context);
}
public ParentViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
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);
}
}
这里我用的是第二种方法,改善后为: