Android中Viewpager禁止滑动的实现
前言
现在很多app,首页不允许滑动切换(因为页面加载吧),但是又用viewpage来管理frgament.因为方便嘛.
以前在网上找的例子:
publicclassNoScrollViewPagerextendsViewPager{
publicNoScrollViewPager(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicNoScrollViewPager(Contextcontext){
super(context);
}
@Override
publicbooleandispatchTouchEvent(MotionEventev){
//不拦截,否则子孩子都无法收到事件,一般这个自定义的时候都不作处理
returnsuper.dispatchTouchEvent(ev);
}
@Override
publicbooleanonInterceptTouchEvent(MotionEventev){
returnsuper.onInterceptTouchEvent(ev);
}
@Override
publicbooleanonTouchEvent(MotionEventev){
returntrue;
}
这个自定义如果继承的Viewpager是低版本的,那么是没问题的.
但是如果你编译时用是高版本的api,5.0以后吧.上面这个自定义就会失效,
你会发现,会有细微的滑动.还是能滑动的
判断老的还是新的,看setOnPageChangeListener就知道了
最新的Viewpager里面这个方法已经废弃了,改成addOnPageChangeListener()了.
由于之前改viewpager做懒加载.一直保留了一个老版本的Viewpager使用.直到最近才发现.
改进后
publicclassNoScrollViewPagerextendsViewPager{
privatebooleanisScroll;
publicNoScrollViewPager(Contextcontext,AttributeSetattrs{
super(context,attrs);
}
publicNoScrollViewPager(Contextcontext){
super(context);
}
/**
*1.dispatchTouchEvent一般情况不做处理
*,如果修改了默认的返回值,子孩子都无法收到事件
*/
@Override
publicbooleandispatchTouchEvent(MotionEventev){
returnsuper.dispatchTouchEvent(ev);//returntrue;不行
}
/**
*是否拦截
*拦截:会走到自己的onTouchEvent方法里面来
*不拦截:事件传递给子孩子
*/
@Override
publicbooleanonInterceptTouchEvent(MotionEventev){
//returnfalse;//可行,不拦截事件,
//returntrue;//不行,孩子无法处理事件
//returnsuper.onInterceptTouchEvent(ev);//不行,会有细微移动
if(isScroll){
returnsuper.onInterceptTouchEvent(ev);
}else{
returnfalse;
}
}
/**
*是否消费事件
*消费:事件就结束
*不消费:往父控件传
*/
@Override
publicbooleanonTouchEvent(MotionEventev){
//returnfalse;//可行,不消费,传给父控件
//returntrue;//可行,消费,拦截事件
//super.onTouchEvent(ev);//不行,
//虽然onInterceptTouchEvent中拦截了,
//但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
if(isScroll){
returnsuper.onTouchEvent(ev);
}else{
returntrue;//可行,消费,拦截事件
}
}
publicvoidsetScroll(booleanscroll){
isScroll=scroll;
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。