Viewpager禁止滑動

前言

現(xiàn)在很多app,首頁不允許滑動切換(因為頁面加載吧),但是又用viewpage來管理frgament.因為方便嘛.

以前在網(wǎng)上找的例子:

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以后吧.上面這個自定義就會失效,

你會發(fā)現(xiàn),會有細微的滑動.還是能滑動的

判斷老的還是新的,看setOnPageChangeListener就知道了

最新的Viewpager里面這個方法已經(jīng)廢棄了,改成addOnPageChangeListener()了.

由于之前改viewpager做懶加載.一直保留了一個老版本的Viewpager使用.直到最近才發(fā)現(xiàn).

改進后

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;
    } 
}  
 /**  
  * 是否消費事件 
  * 消費:事件就結(jié)束  
  * 不消費:往父控件傳   
 */   
@Override 
  public boolean onTouchEvent(MotionEvent ev) {    
   //return false;// 可行,不消費,傳給父控件   
   //return true;// 可行,消費,攔截事件  
   //super.onTouchEvent(ev); //不行,
   //雖然onInterceptTouchEvent中攔截了,
   //但是如果viewpage里面子控件不是viewgroup,還是會調(diào)用這個方法. 
    if (isScroll){
         return super.onTouchEvent(ev);
    }else {  
         return true;// 可行,消費,攔截事件
    }
  }
  public void setScroll(boolean scroll) {
      isScroll = scroll;
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容