背景:
最近开发一个项目,基于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移出的原因应该是一致的.