Viewpager禁止滑动

作者: Jlanglang | 来源:发表于2016-12-02 12:07 被阅读12965次

前言

现在很多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;
  }
}

相关文章

  • ViewPager禁止滑动

    接着直接在布局里使用这个ViewPager 这样就可以禁止viewpager滑动

  • Viewpager禁止滑动

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

  • ViewPager禁止滑动

    ViewPager的滑动包括以下两个方面: 通过 Touch 触摸的形式进行; 使用遥控器,通过每个Page上面的...

  • 禁止ViewPager滑动

    项目实际需求中可能会有设置ViewPager禁止滑动的需求,此时需要重写ViewPager处理触屏事件

  • ViewPager 禁止滑动

    看到网上有千篇一律的解决方法,我亲测总结了两种方法 截断分发事件,这种方法适合viewpager嵌套使用 返回fa...

  • ViewPager禁止滑动

    一、简介: 有时项目中会有这样的需求:在ViewPager的里面再嵌入ViewPager,那么就有冲突了,简单粗暴...

  • 禁止滑动功能的自定义ViewPager

    /** 提供禁止滑动功能的自定义ViewPager*/public class NoScrollViewPager...

  • 禁止滑动的ViewPager

    ViewPager非常好用,但有时候需要在ViewPager的里面再嵌入ViewPager,那么就有冲突了,简单粗...

  • ViewPager禁止左右滑动

    网上看了很多关于ViewPager禁止左右滑动的方法,自己尝试了下,发现还是第一种修改方式比较好,记录下来,后续考...

  • Android ViewPager 禁止滑动

    public class NoScrollViewPagerextends ViewPager { private...

网友评论

  • Bury丶冬天:正好遇到,每次都能滑动那么一点点,不停的滑动就可以滑动到另外一页
  • 七岁就狠拽:没看到细微的滚动啊, 楼主是用的什么机子测的? 能说下禁止滚动后怎么才能看到细微滚动的现象么?
    Jlanglang:多试试v4包版本,以及不同版本的手机,现在已经27了,不知道是不是已经修复这个问题了
  • 戴定康:好像没这么复杂吧
  • 65afce0ac90c:mViewPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    return true;
    }
    });
    onTouchListener监听中的方法onTouch()会有boolean返回值,onTouch()返回值会决定控件中的onTouchEvent()是否执行.
    返回true时候,控件本身的onTouchEvent()不会再执行.返回false的时候,控件本身的onTouchEvent()还会执行.
    所以为啥不这样让ViewPager禁止滑动?
    Jlanglang:而且,只要走了onInterceptTouchEvent,就会有细微滑动.所以这里才直接在onInterceptTouchEvent返回false.
    光写ontouchlistener来拦截也不靠谱
    Jlanglang:每次用都去写个onTouchlistener么

    这样复写控件是为了用起来方便而已.
    起嚸_:还是会有细微滑动,能滑动
  • 0ba43f5af2a7:楼主 我想要ViewPage禁止竖向滑动,用了你这个Demo不好使啊。不知道为什么呢
    Jlanglang: @DDDhy 竖的没试过 ~ ~

本文标题:Viewpager禁止滑动

本文链接:https://www.haomeiwen.com/subject/powfmttx.html