当前位置: 移动技术网 > IT编程>移动开发>Android > Android中Viewpager禁止滑动的实现

Android中Viewpager禁止滑动的实现

2019年07月24日  | 移动技术网IT编程  | 我要评论

鬼雾衬肩,捷克国家队,难以抗拒饶阡陌

前言

现在很多app,首页不允许滑动切换(因为页面加载吧),但是又用viewpage来管理frgament.因为方便嘛.

以前在网上找的例子:

public class noscrollviewpager extends viewpager { 
 public noscrollviewpager(context context, attributeset attrs) { 
  super(context, attrs); 
 } 
public noscrollviewpager(context context) { 
 super(context); 
 } 
 @override 
 public boolean dispatchtouchevent(motionevent ev) {  
 //不拦截,否则子孩子都无法收到事件,一般这个自定义的时候都不作处理
 return super.dispatchtouchevent(ev); 
 } 
@override
 public boolean onintercepttouchevent(motionevent ev) { 
 return super.onintercepttouchevent(ev);
 } 
 @override
 public boolean ontouchevent(motionevent ev) { 
  return true;
 }

这个自定义如果继承的viewpager是低版本的,那么是没问题的.

但是如果你编译时用是高版本的api,5.0以后吧.上面这个自定义就会失效,

你会发现,会有细微的滑动.还是能滑动的

判断老的还是新的,看setonpagechangelistener就知道了

最新的viewpager里面这个方法已经废弃了,改成addonpagechangelistener()了.

由于之前改viewpager做懒加载.一直保留了一个老版本的viewpager使用.直到最近才发现.

改进后

public class noscrollviewpager extends viewpager { 
private boolean isscroll;
public noscrollviewpager(context context,attributesetattrs{ 
 super(context, attrs); 
 } 
 public noscrollviewpager(context context) {  
  super(context); 
 } 
/** 
 * 1.dispatchtouchevent一般情况不做处理
 *,如果修改了默认的返回值,子孩子都无法收到事件 
 */ 
 @override
 public boolean dispatchtouchevent(motionevent ev) {      
  return super.dispatchtouchevent(ev); // return true;不行 
 } 
 /** 
 * 是否拦截 
 * 拦截:会走到自己的ontouchevent方法里面来 
 * 不拦截:事件传递给子孩子 
 */ 
 @override
 public boolean onintercepttouchevent(motionevent ev) {
 // return false;//可行,不拦截事件,
  // return true;//不行,孩子无法处理事件
  //return super.onintercepttouchevent(ev);//不行,会有细微移动 
 if (isscroll){ 
   return super.onintercepttouchevent(ev);
 }else{ 
   return false;
 } 
} 
 /** 
 * 是否消费事件 
 * 消费:事件就结束 
 * 不消费:往父控件传 
 */ 
@override 
 public boolean ontouchevent(motionevent ev) { 
 //return false;// 可行,不消费,传给父控件 
 //return true;// 可行,消费,拦截事件 
 //super.ontouchevent(ev); //不行,
 //虽然onintercepttouchevent中拦截了,
 //但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法. 
 if (isscroll){
   return super.ontouchevent(ev);
 }else { 
   return true;// 可行,消费,拦截事件
 }
 }
 public void setscroll(boolean scroll) {
  isscroll = scroll;
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网