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

2016-06-01 21:00 阅读 7,385 次 评论 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 标签:,
让您的站点主页与WordPress安装目录不同 让您的站点主页与WordPress安装
LayoutParams通知父容器childView被放置在哪里 LayoutParams通知父容器childV
冒泡算法 冒泡算法
关于刘翔妈妈我听闻的一件事,绝对不是个好伺候的婆婆 关于刘翔妈妈我听闻的一件事,绝