【问题标题】:Is InputMethodService.onUpdateSelection asynchronous?InputMethodService.onUpdateSelection 是异步的吗?
【发布时间】: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


    【解决方案1】:

    解决方案是使用InputConnection.beginBatchEditInputConnection.endBatchEdit

    在“batchEdit”块中对 currentInputConnection 所做的任何更改都会在最后集中到一个单独的 onUpdateSelection 调用中。

    例如,当执行以下操作时:

    service.currentInputConnection.beginBatchEdit()
    commitTextToInputConnection("Test1")
    commitTextToInputConnection("Test2")
    service.currentInputConnection.endBatchEdit()
    

    onUpdateSelection 只调用一次,在块中的所有更改都已完成之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2017-02-19
      • 2015-08-03
      • 2021-03-30
      • 2019-01-13
      • 1970-01-01
      相关资源
      最近更新 更多