5

的文档InputConnection.commitText(CharSequence text, int newCursorPosition)说这newCursorPosition意味着:

int:文本周围的新光标位置,以 Java 字符表示。如果 > 0,这是相对于文本结尾的 - 1;如果 <= 0,这是相对于文本的开头。因此,值为 1 将始终将光标前进到插入全文之后的位置。请注意,这意味着您无法将光标定位在文本中,因为编辑器可以对您提供的文本进行修改,因此无法在此处正确指定位置。

这个例子中,如果我输入两个字符,然后像这样将光标放在它们之间

在此处输入图像描述

然后输入另一个字符,我设置newCursorPosition0or都没关系1。光标始终位于插入的末尾。例如调用

inputConnection.commitText("aaa", 0);

或者

inputConnection.commitText("aaa", 1);

两者都像这样显示光标:

在此处输入图像描述

如果我这样-1

inputConnection.commitText("aaa", -1);

我明白了

在此处输入图像描述

根据文档,预期结果1-1结果。为什么不0将光标放在插入的开头?我希望0应该是这样的

inputConnection.commitText("aaa", 0);

在此处输入图像描述

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

4

1 回答 1

3

这看起来像是代码中的一个缺陷,但你是法官。

看看replaceText()BaseInputConnection. 我相信这是插入后放置光标的代码。(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 的像素模拟器中和上的执行路径,BaseInputConnection并且newCursorPosition = 0上面newCursorPosition = 1概述的内容确实成立。

于 2017-09-19T13:54:09.307 回答