这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
有时候在开发中会遇到一些特别的要求,如在 ViewPager 中嵌入 ListView,或者再嵌入一个 ViewPager,那么在滑动的时候就会造成被嵌入的 XXView 不能滑动了,那么就把最外层的 ViewPager 禁止滑动吧,本文就介绍了 Android 中 Viewpager 禁止滑动的实现方法,需要的朋友可以参考。
前言
现在很多 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;
- }
- }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/17/0525/335228.html