InputConnection类在华为手机运行异常 输入字符被覆盖如何解决
问题根因
这个问题是华为EMUI/HarmonyOS系统对Android原生输入框架的定制化修改导致的:
原生AOSP中InputConnection.commitText(CharSequence text, int newCursorPosition)的第二个参数含义为:
- 正数:光标移动到插入文本结束位置的偏移量(传1代表光标在插入文本后1位,无选中内容时默认追加文本)
- 负数:光标移动到插入文本开始位置的偏移量
但华为定制的输入框架对参数为正数的场景做了特殊处理:调用commitText传正整数时,会自动选中输入框内的全部已有文本,下一次调用commitText时新内容会直接覆盖选中的旧内容,就出现了输入字符被替换的现象,其他品牌设备沿用原生逻辑所以不会触发该问题。
修复方案
- 方案1:调整
commitText的第二个参数为插入文本的实际长度,不要固定传1。华为系统对动态长度参数的适配更符合预期,修改后的代码为:inputConnection.commitText(inputedCharacter.toString(), inputedCharacter.toString().length()) - 方案2:调用
commitText前主动清除输入框的选中状态,避免新内容覆盖选中的旧内容,示例代码如下:
// 先将光标移动到已有文本末尾,清除选中状态 int end = inputConnection.getTextBeforeCursor(Integer.MAX_VALUE, 0).length(); inputConnection.setSelection(end, end); inputConnection.commitText(inputedCharacter.toString(), 1);
- 方案3:如果自定义输入场景的逻辑允许,也可以直接拼接文本后设置到TextView,规避InputConnection的兼容问题:
// Kotlin 示例 val currentText = textView.text.toString() textView.text = currentText + inputedCharacter // 移动光标到末尾 textView.setSelection(textView.text.length)
内容的提问来源于stack exchange,提问作者MbProger
相关产品推荐
相关产品推荐

