Android 禁止ViewPager滑动,你所不知道的细节

来源:互联网 发布:cpu风扇转速软件 编辑:程序博客网 时间:2024/06/07 08:10

要实现禁止ViewPager的滑动,要怎么实现呢?

第一想到就是继承ViewPager,重写ViewPager的TouchEvent事件,在TouchEvent的事件中不作任何直接return true即可。

但是这样就可以了吗?NO

你可以试一下在Viewpager中的一个输入框,弹出软键盘,然后再软键盘上向左滑动或者向右滑动,此时你会发现当光标滑到输入框的最左边或者最后边时,ViewPager依然会滑动,why?(此种情况下,在有的手机很容易复现,有的手机不容易,华为和夏新的手机容易复现,HTC的不容易复现)

根据遇到的问题,是由于软键盘的滑动引起,既然知道原因,那么我们直接看ViewPaer中的dispatchKeyEvent方法:

@Overridepublic 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


阅读全文
0 0
原创粉丝点击