代码之家  ›  专栏  ›  技术社区  ›  Luke Needham

InputMethodService.OnUpdateSelection是异步的吗?

  •  0
  • Luke Needham  · 技术社区  · 8 年前

    我正在自定义输入法。我试图跟踪用户手动更改文本的选择区域的时间(而不是由于输入法本身的操作而更改的选择,如 commitText )

    为此,我将跟踪IME期望选择位置的位置,并将其与来自的实际选择位置进行比较。 onUpdateSelection .

    例如,要提交我使用的文本:

    private fun commitTextToInputConnection(text: String)
    {
        moveExpectedSelection(text.length)
        service.currentInputConnection.commitText(text, 1)
    }
    

    但是,如果我这样做:

    commitTextToInputConnection("Test1")
    commitTextToInputConnection("Test2")
    

    我发现,按顺序,以下顺序发生:

    1-“测试1”的预期选择职位更新

    2-“测试2”的预期选择职位更新

    3-调用“test1”的OnUpdateSelection

    4-调用“test2”的OnUpdateSelection

    显然,这个顺序是错误的,导致我的输入法有一个错误的预期选择位置。

    最奇怪的是,对于某些活动,预期的选择位置更新和OnUpdateSelection调用的顺序总是以正确的顺序发生。对于其他活动,它们总是以相同(错误)的顺序发生。

    这是怎么回事?我猜 委托文本 等等,必须是异步的,导致这种竞争条件,但文档中根本没有提到这一点。

    这个问题有什么解决办法吗?或者,是否有其他方法可以专门监听用户手动触发的文本选择更改,而不是IME?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Luke Needham    8 年前

    InputConnection.beginBatchEdit InputConnection.endBatchEdit

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