要實現禁止ViewPager的滑動,要怎麼實現呢?
第一想到就是繼承ViewPager,重寫ViewPager的TouchEvent事件,在TouchEvent的事件中不作任何直接return true即可。
但是這樣就可以了嗎?NO
你可以試一下在Viewpager中的一個輸入框,彈出軟鍵盤,然後再軟鍵盤上向左滑動或者向右滑動,此時你會發現當光標滑到輸入框的最左邊或者最後邊時,ViewPager依然會滑動,why?(此種情況下,在有的手機很容易復現,有的手機不容易,華爲和夏新的手機容易復現,HTC的不容易復現)
根據遇到的問題,是由於軟鍵盤的滑動引起,既然知道原因,那麼我們直接看ViewPaer中的dispatchKeyEvent方法:
@Override public boolean dispatchKeyEvent(KeyEvent event) { // Let the focused view and/or our descendants get the key first return super.dispatchKeyEvent(event) || executeKeyEvent(event); }
接着我們繼續看executeKeyEvent方法:public boolean executeKeyEvent(KeyEvent event) { boolean handled = false; if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_DPAD_LEFT: handled = arrowScroll(FOCUS_LEFT); break; case KeyEvent.KEYCODE_DPAD_RIGHT: handled = arrowScroll(FOCUS_RIGHT); break; case KeyEvent.KEYCODE_TAB: if (Build.VERSION.SDK_INT >= 11) { // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD // before Android 3.0. Ignore the tab key on those devices. if (KeyEventCompat.hasNoModifiers(event)) { handled = arrowScroll(FOCUS_FORWARD); } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) { handled = arrowScroll(FOCUS_BACKWARD); } } break; } } return handled; }executeKeyEvent方法中會根據是否是KEYCODE_DPAD_LEFT
KEYCODE_DPAD_RIGHT
KEYCODE_TAB
來調用arrowScroll的方法,arrowScroll方法顧名思義就是是否允許滑動,它的參數就是向前、向後滑動。好,我們繼續往下看看arrowScroll方法:此處不貼源碼了,最終會在arrowScroll中調用pageLeft和pageRight方法,我們看下pageLeft的方法:boolean pageLeft() { if (mCurItem > 0) { setCurrentItem(mCurItem-1, true); return true; } return false; }此處調用setCurrentItem來跳轉頁面了。
綜合上面的分析,我們知道了根本原因是executeKeyEvent引起的,那麼我們可以直接重寫executeKeyEvent方法,在executeKeyEvent方法中直接返回false即可
from:http://blog.csdn.net/jxiang112/article/details/51701946