InputConnection.commitText(CharSequence text, int newCursorPosition)
的文档说newCursorPosition
表示:
int:文本周围的新光标位置,以Java字符表示。 如果> 0,这是相对于文本的结尾 - 1;如果< = 0,这是 相对于文本的开头。因此,值1将始终前进 光标移动到插入全文后的位置。注意 这意味着你无法将光标定位在文本中,因为 编辑器可以对您提供的文本进行修改 无法在那里正确指定位置。
在this example中,如果我输入两个字符,则将光标定位在它们之间
然后输入另一个字符,如果我将newCursorPosition
设置为0
或1
,则无关紧要。光标始终位于插入的末尾。例如调用
inputConnection.commitText("aaa", 0);
或
inputConnection.commitText("aaa", 1);
两者都显示如下光标:
如果我{/ 1}}
-1
我明白了
根据文档,预计inputConnection.commitText("aaa", -1);
和1
结果。 为什么-1
没有将光标放在插入的开头?我希望0
应该是这样的
0
但事实并非如此。为什么不呢?
答案 0 :(得分:3)
这看起来像代码中的缺陷,但你是判断。
查看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)
能够产生您看到的结果。
我没有完全遵循这个位置的代码,但我相信这就是问题所在。我已经跟踪BaseInputConnection
中newCursorPosition = 0
和{newCursorPosition = 1
的执行路径{1}}在带有API 21的Pixel仿真器上,以及上面列出的内容确实存在。