前言
現在很多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; }}總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答