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; } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。