Android 禁止ViewPager滑動,你所不知道的細節

要實現禁止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


發佈了58 篇原創文章 · 獲贊 22 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章