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;
  }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,132評論 25 708
  • 一、簡介: 有時項目中會有這樣的需求:在ViewPager的里面再嵌入ViewPager,那么就有沖突了,簡單粗暴...
    萬戶猴閱讀 2,663評論 0 6
  • 看到網上有千篇一律的解決方法,我親測總結了兩種方法 截斷分發事件,這種方法適合viewpager嵌套使用 返回fa...
    HarryXR閱讀 8,455評論 5 12
  • 持而盈之不如其己;揣而銳之不可長保;金玉滿堂莫之能守;富貴而驕,自遺其咎。功遂身退,天之道。 適可而止的藝術 功遂...
    閻耀永閱讀 426評論 2 0
  • 她是個矮小但是堅韌的女人。初見她,讓我對她充滿了好奇和敬佩。她是一個退休老干部,一輩子兢兢業業嚴于律己,按照常理來...
    大象的屎粑粑是超大一坨閱讀 366評論 0 0