Android InputMethodService.OnUpdate选择是否异步?
我正在做一个自定义输入法。我试图跟踪用户何时手动更改文本的选择区域(而不是由于IME本身的操作而更改选择,如) 要做到这一点,我要跟踪IME期望选择位置的位置,并将其与来自的实际选择位置进行比较 例如,要提交文本,我使用:Android InputMethodService.OnUpdate选择是否异步?,android,kotlin,ime,android-input-method,Android,Kotlin,Ime,Android Input Method,我正在做一个自定义输入法。我试图跟踪用户何时手动更改文本的选择区域(而不是由于IME本身的操作而更改选择,如) 要做到这一点,我要跟踪IME期望选择位置的位置,并将其与来自的实际选择位置进行比较 例如,要提交文本,我使用: private fun commitTextToInputConnection(text: String) { moveExpectedSelection(text.length) service.currentInputConnection.commitTe
private fun commitTextToInputConnection(text: String)
{
moveExpectedSelection(text.length)
service.currentInputConnection.commitText(text, 1)
}
但是,如果我这样做:
commitTextToInputConnection("Test1")
commitTextToInputConnection("Test2")
我发现,顺序如下:
1-预期的“测试1”的SelectionPosition更新
2-预期的“Test2”选择位置更新
3-调用“Test1”的onUpdate选择
4-调用“Test2”的onUpdate选择
显然,此顺序不正确,并导致我的IME的ExpectedSelectionPosition不正确
最奇怪的是,对于某些活动,ExpectedSelectionPosition更新和onUpdateSelection调用的顺序总是正确的。对于其他活动,它们总是以相同(错误)的顺序发生
这是怎么回事?我猜,etc必须是异步的,导致这种竞争条件,但文档中根本没有提到这一点
这个问题有什么解决办法吗?或者,是否有其他方法可以专门监听用户手动触发的文本选择更改,而不是IME?解决方案是使用和
在“batchEdit”块中对currentInputConnection所做的任何更改最后都会集中到一个ONUpdate选择调用中
例如,当执行以下操作时:
service.currentInputConnection.beginBatchEdit()
commitTextToInputConnection("Test1")
commitTextToInputConnection("Test2")
service.currentInputConnection.endBatchEdit()
在对块进行所有更改后,只调用一次OnUpdate选择