华为手机InputConnection类异常:输入新字符替换原有文本是什么原因?
问题根因说明
- 该问题是华为(含鸿蒙系统)设备定制的输入法框架兼容性差异导致的,和当前业务逻辑没有直接关联:
原生AOSP实现中,InputConnection.commitText(text, 1)的第二个参数newCursorPosition=1代表新文本插入到当前光标位置后,光标移动到新文本末尾偏移1位的位置,符合追加输入的预期。但华为定制的输入法服务在部分版本中存在实现bug:调用commitText时如果没有显式指定选中范围,会错误将输入框内全部已有文本标记为「选中待替换」状态,新输入的字符就会直接覆盖原有内容。 - 可以通过以下方式验证根因:在出现问题的华为设备上安装第三方通用输入法(如官方版百度输入法、搜狗输入法)测试,输入逻辑会恢复正常,排除自身代码逻辑问题。
修复方案
- 方案1:直接调整
commitText的第二个参数为0即可解决,华为输入法框架对该参数值的适配更稳定,不会触发覆盖逻辑,修改后代码如下:inputConnection.commitText(inputedCharacter.toString(), 0); - 方案2:如果需要严格控制光标定位,可在提交文本前后手动控制光标位置,完全规避系统输入法的默认逻辑:
// 提交前获取当前光标位置 int curSelection = editText.getSelectionStart(); inputConnection.commitText(inputedCharacter.toString(), 1); // 提交后手动把光标后移一位 editText.setSelection(curSelection + 1);
内容的提问来源于stack exchange,提问作者ProcgerXacker
相关产品推荐
相关产品推荐

