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即可


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值