【发布时间】:2019-01-05 02:12:39
【问题描述】:
我正在制作自定义 IME。我正在尝试跟踪用户何时手动更改文本的选择区域(而不是由于 IME 本身的操作而导致选择更改,例如 commitText)。
为此,我会跟踪 IME 预计选择位置的位置,并将其与来自 onUpdateSelection 的实际选择位置进行比较。
例如,提交我使用的文本:
private fun commitTextToInputConnection(text: String)
{
moveExpectedSelection(text.length)
service.currentInputConnection.commitText(text, 1)
}
但是,如果我这样做:
commitTextToInputConnection("Test1")
commitTextToInputConnection("Test2")
我发现按顺序发生了以下顺序:
1 - “Test1”的 ExpectedSelectionPosition 更新
2 - “Test2”的 ExpectedSelectionPosition 更新
3 - 调用“Test1”的 onUpdateSelection
4 - 调用“Test2”的 onUpdateSelection
显然,此顺序不正确,并导致我的 IME 具有不正确的 ExpectedSelectionPosition。
最奇怪的是,对于某些活动,ExpectedSelectionPosition 更新和 onUpdateSelection 调用的顺序总是以正确的顺序发生。对于其他活动,它们始终以相同(错误)的顺序发生。
这里发生了什么?我猜commitText 等肯定是异步的,导致了这种竞争条件,但文档中根本没有提到这一点。
是否有解决此问题的方法?或者,有没有其他方法可以专门监听用户手动触发的文本选择更改,而不是 IME?
【问题讨论】:
标签: android kotlin ime android-input-method