InputConnection.commitText(CharSequence text, int newCursorPosition) 的文档说newCursorPosition的意思是:



this example中,如果我输入两个字符,则将光标定位在两个字符之间

android - 使用InputConnection.commitText将光标设置在插入文本的开头-LMLPHP

然后输入另一个字符,将newCursorPosition设置为0还是1都没关系。光标始终位于插入的末尾。例如打电话

inputConnection.commitText("aaa", 0);

或者
inputConnection.commitText("aaa", 1);

两者都显示光标,如下所示:

android - 使用InputConnection.commitText将光标设置在插入文本的开头-LMLPHP

如果我用-1
inputConnection.commitText("aaa", -1);

我明白了

android - 使用InputConnection.commitText将光标设置在插入文本的开头-LMLPHP

根据文档预期1-1结果。 为什么0不将光标放在插入的开头? 我希望0应该像这样
inputConnection.commitText("aaa", 0);

android - 使用InputConnection.commitText将光标设置在插入文本的开头-LMLPHP

但事实并非如此。为什么不?

最佳答案

这看起来像是代码中的缺陷,但您要当裁判。

看看BaseInputConnection中的replaceText()。我相信这是在插入后放置光标的代码。 (replaceText()是从commitText())调用的。

在引用的代码中,a是选择开始。 b是选择结束。由于示例中没有选择,并且光标位于索引1处,因此为a == b == 1。另外,直到光标移动到新选择之后,才插入新文本(aaa)(替换选择[a,b])。
Selection.setSelection(content, newCursorPosition)设置光标位置,因此对于0和1在您的示例中产生相同的定位,我希望newCursorPosition的派生值对于两个输入都相同。

将光标置于位置1处的两个8之间。让我们仔细考虑以下代码:

if (newCursorPosition > 0) {
    newCursorPosition += b - 1;
} else {
    newCursorPosition += a;
}

对于您输入的1,newCursorPosition> 0,因此newCursorPosition = newCursorPosition + 1-1或1。

对于您输入的0,newCursorPosition不等于0,因此newCursorPosition = newCursorPosition + a(0 + 1)或1。

由于两个输入产生相同的值,所以我希望Selection.setSelection(content, newCursorPosition)产生您看到的结果。

我没有完全按照此代码执行此操作,但是我相信这是问题所在。我已经在具有API 21的Pixel模拟器上按照BaseInputConnection中的newCursorPosition = 0newCursorPosition = 1的执行路径进行了操作,上面概述的内容确实适用。

10-08 16:48