ViewPager嵌套ViewPager不能响应滑动事件解决方法

不响应原因:
  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(),并拦截。
 
[java]   view plain copy
  1. public boolean dispatchTouchEvent(MotionEvent ev)  
  2. {  
  3.   boolean ret = super.dispatchTouchEvent(ev);  
  4.   if(ret)   
  5.   {  
  6.     ((ViewGroup)itemViewPager.getParent()).requestDisallowInterceptTouchEvent(true);  
  7.   }  
  8.   return ret;  
  9. }   

 

三:对子view实现setOnTouchListener(new ...)监听,在onTouch()方法里,进行拦截。调用当前子view的onInterceptTouchEvent()方法。
 
[java]   view plain copy
  1. public boolean onTouch(View v, MotionEvent event) {  
  2.     switch (event.getAction()) {  
  3.     case MotionEvent.ACTION_MOVE:   
  4.         ((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);  
  5.         break;  
  6.     case MotionEvent.ACTION_UP:  
  7.     case MotionEvent.ACTION_CANCEL:  
  8.         ((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);  
  9.         break;  
  10.     }  
  11. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值