我正在开发一个软键盘。我有一个扩展InputMethodService
的类MyIME
。
我覆盖onKey(int, int)
来处理按键。我的键盘能够按照我在纵向模式下定义的方式插入和删除文本,当键盘设置为全屏时,我只是遇到了横向问题。
在全屏模式下,使用框架的默认ExtractEditLayout
,其中包含ExtractEditText
实例。当我在全屏模式下键入时,会发生以下奇怪的行为:
- 我可以很好地键入普通字符。我使用
getCurrentInputConnection().commitText(String.valueOf(code), 1);
插入这些 -
当我按退格键删除字符时,光标向后移动并删除前一个字符。这表现得很好。从这一点开始,后续的击键不再按预期运行:
-
如果我在第一个之后按退格键,光标会向后移动,但该字符不会被删除。按下退格键时,将执行
getCurrentInputConnection().deleteSurroundingText(1, 0);
。 -
同样,如果我在按退格键一次后添加更多字符,光标将向前移动,但字符不会出现在屏幕上。
-
当我通过将设备旋转回纵向退出全屏模式时,我键入或删除的所有字符都在那里。似乎用于撰写全屏消息的ExtractEditLayout
与我的InputMethodService
子类不同步,并且似乎只有在我最初尝试删除字符后它们才会变得不同步。
该错误与我每次按退格键时所做的昂贵ExtractedTextRequest
有关。该请求用于确定文本字段是否为空,以便我可以确定是否将键盘设置为移位状态。
我摆脱了ExtractedTextRequest
,现在通过对InputConnection
的getTextBeforeCursor()
和getTextAfterCursor()
进行两次(大)调用来确定文本字段是否为空,并且我在这篇文章的问题组件中描述的不良行为不再发生。