不响应原因:
ViewPager嵌套ViewPager或者嵌套ViewFlipper都不能正确相应滑动事件,皆因嵌套的子view在TouchEvent传递过程中没有消费此次事件,而由parent View消费了事件,从而在后续的TouchEvent (ACTION_MOVE或者ACTION_UP)传递过程中就不会传递到子view的onTouchEvent那,所以无法响应触摸事件。
关于传递 简单理解就是从上到下 从爷爷view到孙子等等的view:
如果上层onInterceptTouchEvent 返回 false 那么就由本层 onTouchEvent 处理
如果本层onTouchEvent返回true 则表示消费这个事件
如果上层onInterceptTouchEvent 返回 true 所有的move down都让本层给截取了 也就不往下传递了
更多了解在上一篇文章
《Android onTouch事件传递机制》
解决的办法:
一:重写被嵌套的ViewPager,实现onInterceptTouchEvent()方法,拦截TouchEvent。(此方法较为复杂,不建议使用)
二:实现parent View的dispatchTouchEvent()方法,将TouchEvent派发给子View的onInterceptTouchEvent(),并拦截。
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean ret = super.dispatchTouchEvent(ev);
if(ret)
{
((ViewGroup)itemViewPager.getParent()).requestDisallowInterceptTouchEvent(true);
}
return ret;
}
三:对子view实现setOnTouchListener(new ...)监听,在onTouch()方法里,进行拦截。调用当前子view的onInterceptTouchEvent()方法。
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);
break;
}
}