关于ViewPager冲突问题分析及解决思路

2016-06-01 21:00 阅读 6,820 次 评论 1 条

摘要

父控件拦截子控件的触摸事件解决办法,重写子控件中的onInterceptTouchEvent(boolean)方法,然后设置父控件在执行该方法时返回true,即父控件不拦截子控件的触摸事件。经常遇到的一个触摸冲突的一个控件ViewPager,ViewPager可以左右滑动,每个Fragment展示新闻列表,使用PullToRefreshListView控件,在设置的适配器中第一栏添加头条滚动效果,需要给头条添加左右滑动的事件,这个时候与ViewPager的左右滑动冲突。重写子控件是第一种解决办法,第二种解决办法是重写父控件,其原理就是设置父控件的onInterceptTouchEvent()返回值为true,以后再遇到事件冲突的问题都可以这样子解决。

onRequestDisallowTouchEvent.jpg

第一种解决办法:重写子控件

  1. private ViewGroup parent;    
  2.     public void setDisallowInterceptParentTouchEvent(ViewGroup parent) {    
  3.         this.parent = parent;    
  4.     }  
  5.     @Override    
  6.     public boolean dispatchTouchEvent(MotionEvent ev) {    
  7.         if (parent != null) {    
  8.             parent.requestDisallowInterceptTouchEvent(true);    
  9.         }    
  10.         return super.dispatchTouchEvent(ev);    
  11.     }    
  12.     
  13.     @Override    
  14.     public boolean onInterceptTouchEvent(MotionEvent arg0) {    
  15.         if (parent != null) {    
  16.             parent.requestDisallowInterceptTouchEvent(true);    
  17.         }    
  18.         return super.onInterceptTouchEvent(arg0);    
  19.     }    
  20.     
  21.     @Override    
  22.     public boolean onTouchEvent(MotionEvent arg0) {    
  23.         if (parent != null) {    
  24.             parent.requestDisallowInterceptTouchEvent(true);    
  25.         }    
  26.         return super.onTouchEvent(arg0);    
  27.     }  

第二种解决办法:重写父控件

  1. @Override    
  2.     public boolean dispatchTouchEvent(MotionEvent ev) {    
  3.            
  4.         requestDisallowInterceptTouchEvent(true);    
  5.            
  6.         return super.dispatchTouchEvent(ev);    
  7.     }    
  8.     
  9.     @Override    
  10.     public boolean onInterceptTouchEvent(MotionEvent arg0) {    
  11.            
  12.         requestDisallowInterceptTouchEvent(true);    
  13.           
  14.         return super.onInterceptTouchEvent(arg0);    
  15.     }    
  16.     
  17.     @Override    
  18.     public boolean onTouchEvent(MotionEvent arg0) {    
  19.          
  20.         requestDisallowInterceptTouchEvent(true);    
  21.           
  22.         return super.onTouchEvent(arg0);    
  23.     }  

解决的原理:设置父控件的onInterceptTouchEvent()返回值为true,请求不拦截触摸事件

你可能感兴趣的文章

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ158#9359$239或公众号TeachCourse)
转载请注明出处: https://www.teachcourse.cn/1795.html ,谢谢支持!

资源分享

分类:Android 标签:,
Android开发之深入理解RectF和Rect之间的区别 Android开发之深入理解RectF和
Eclipse导入另一台电脑下的Android项目style文件出现错误的原因 Eclipse导入另一台电脑下的And
浅谈Android DVM 浅谈Android DVM
PopupWindow实现微信绑定开户行弹窗效果 PopupWindow实现微信绑定开户行