Android Studio开发自定义键盘如何添加方向键控制光标移动
Android自定义键盘方向键实现方案
android:codes取值规则说明
android:codes的取值分为两类:
- 正整数:对应可打印字符的Unicode十进制值,比如数字
0对应48、字母a对应97,这类值系统会自动将对应字符提交到输入框,不需要额外处理。 - 负整数:对应键盘功能键,系统仅对内置的6个固定负值做了默认响应,完整映射如下:
-1:Shift大小写/符号切换键,对应Keyboard.KEYCODE_SHIFT-2:输入模式切换键(比如字母/数字盘切换),对应Keyboard.KEYCODE_MODE-3:取消键,对应Keyboard.KEYCODE_CANCEL-4:输入完成键,对应Keyboard.KEYCODE_DONE-5:退格删除键,对应Keyboard.KEYCODE_DEL-6:回车键,对应Keyboard.KEYCODE_ENTER
方向键没有预置的负值映射,无法仅靠填写
android:codes属性直接实现光标移动,需要给方向键分配不与内置值冲突的自定义code,再在输入法服务的按键回调中手动处理光标逻辑。
具体实现步骤
- 在键盘布局XML中给四个方向键分配自定义code,建议选用-100以下的数值避免和后续系统新增内置值冲突,参考布局如下:
<Row> <Key android:keyLabel="←" android:keyEdgeFlags="left" android:isRepeatable="true" android:codes="-101"/> <Key android:keyLabel="↑" android:isRepeatable="true" android:codes="-102"/> <Key android:keyLabel="↓" android:isRepeatable="true" android:codes="-103"/> <Key android:keyLabel="→" android:keyEdgeFlags="right" android:isRepeatable="true" android:codes="-104"/> </Row>
上面布局中添加的android:isRepeatable="true"属性是为了支持长按方向键连续移动光标,系统会在长按时自动重复触发按键事件。
- 在自定义的
InputMethodService子类中重写onKey方法,拦截方向键对应的自定义code,通过InputConnection发送系统方向键事件实现光标移动:
override fun onKey(primaryCode: Int, keyEvents: IntArray?): Boolean { val ic = currentInputConnection ?: return super.onKey(primaryCode, keyEvents) return when (primaryCode) { -101 -> { ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT)) true } -102 -> { ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP)) true } -103 -> { ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN)) true } -104 -> { ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT)) true } else -> super.onKey(primaryCode, keyEvents) } }
这套逻辑适配所有标准Android输入框,包括系统原生EditText、AppCompatEditText以及大部分第三方输入控件,不需要针对单个输入框做额外适配。
内容的提问来源于stack exchange,提问作者georgor
相关产品推荐
相关产品推荐

