Android 8.0 EditText 焦点无法移动到其他控件

背景:
最近开发一个项目,基于android8.0平台,功能机,没有触屏功能.遇到如下问题:
短信界面,进入编辑短信页面,输入收件人号码后无法将焦点移动到内容输入框.原因分析如下:
写了一个简单demo,demo的界面有一个EditText和两个Button,按下KEYCODE_DPAD_DOWN,看现象.
7.0焦点可以移动到Button但是8.0不可以,怀疑是Android 8.0的代码修改过EditText所致.
查看EditText没有特别的发现,但是查看EditText的父类TextView时发现相对于7.0,8.0的doKeyDown方法多了下面的一段代码:

     // Consume arrows from keyboard devices to prevent focus leaving the editor.
            // DPAD/JOY devices (Gamepads, TV remotes) often lack a TAB key so allow those
            // to move focus with arrows.
            if (event.getSource() == InputDevice.SOURCE_KEYBOARD
                    && isDirectionalNavigationKey(keyCode)) {
                return KEY_EVENT_HANDLED;
            }

event.getSource() == InputDevice.SOURCE_KEYBOARD意思应该是key事件来源是硬件键盘
isDirectionalNavigationKey方法具体如下

 private boolean isDirectionalNavigationKey(int keyCode) {
        switch(keyCode) {
            case KeyEvent.KEYCODE_DPAD_UP:
            case KeyEvent.KEYCODE_DPAD_DOWN:
            case KeyEvent.KEYCODE_DPAD_LEFT:
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                return true;
        }
        return false;
    }

如果按下的是上下左右键则该方法返回true
在该项目的手机设备中event.getSource() == InputDevice.SOURCE_KEYBOARD && isDirectionalNavigationKey(keyCode)两个条件都是true
因此认为事件已经处理,不再向下分发.要想继续处理,注释掉这个if判断即可,注:此种修改方法仅在可以修改源码的情况下有效,如果无法修改源码,需要另找方案,不过焦点无法从EditText移出的原因应该是一致的.

猜你喜欢

转载自blog.csdn.net/u011109881/article/details/79382987