HTC G11自带键盘具有上下左右键,导致不希望的逻辑出现

问题项目当中,ViewPager里面放了3个View,从第1个切换到第2个是有限制条件的,比如,必须填写完某些信息。 但是HTC G11 自带键盘下方多了上下左右4个切换的键,如图:

这个时候按会切换Viewpager所嵌套的几个View。这个问题让我纠结了几天,当时是小白(现在看起来问题很简单了)不知道Android事件分发机制,若要学习Android的事件分发机制建议看   Android源码分析-点击事件派发机制

问题解决思路:手势触发系统键盘的左右滑动事件,首先会传递到Activity的dispatchTouchEvent事件,所以在其里面捕获到键盘的左右事件,返回false即可。因为返回false代表不进行处理该事件。看下它的源码吧,特别是英文注释

/** 
 * Called to process touch screen events.  You can override this to 
 * intercept all touch screen events before they are dispatched to the 
 * window.  Be sure to call this implementation for touch screen events 
 * that should be handled normally. 
 *  
 * @param ev The touch screen event. 
 *  
 * @return boolean Return true if this event was consumed. 
 */  
public boolean dispatchTouchEvent(MotionEvent ev) {  
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {  
        //这个函数其实是个空函数,啥也没干,如果你没重写的话,不用关心  
        onUserInteraction();  
    }  
    //这里事件开始交给Activity所附属的Window进行派发,如果返回true,整个事件循环就结束了  
    //返回false意味着事件没人处理,所有人的onTouchEvent都返回了false,那么Activity就要来做最后的收场。  
    if (getWindow().superDispatchTouchEvent(ev)) {  
        return true;  
    }  
    //这里,Activity来收场了,Activity的onTouchEvent被调用  
    return onTouchEvent(ev);  
}  




问题修复:  在Activity中屏蔽键盘的上下左右

@Override
        public boolean dispatchKeyEvent(KeyEvent event) {
                // TODO Auto-generated method stub
                 switch (event.getKeyCode()) { 
                  case KeyEvent.KEYCODE_DPAD_DOWN://按向下键
                          LogUtil.e(PublishCarActivity.class, "向下");
                          break;
                  case KeyEvent.KEYCODE_DPAD_UP:
                          LogUtil.e(PublishCarActivity.class, "向上");
                          break;
                  
                  case KeyEvent.KEYCODE_DPAD_LEFT:
                          LogUtil.e(PublishCarActivity.class, "向左");
                          return false;
                  
                  case KeyEvent.KEYCODE_DPAD_RIGHT:
                          LogUtil.e(PublishCarActivity.class, "向右"); 
                          return false;
                          }
                return super.dispatchKeyEvent(event);
        }




所以,大家一定要认真学习Android 内部的事件分发机制,这样遇到问题才会“微微一笑,根本不鸟”大笑


你可能感兴趣的:(HTC G11自带键盘具有上下左右键,导致不希望的逻辑出现)