使用InputConnection.commitText

时间:2017-07-18 23:27:29

标签: android android-edittext inputconnection

InputConnection.commitText(CharSequence text, int newCursorPosition)的文档说newCursorPosition表示:

  

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

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

enter image description here

然后输入另一个字符,如果我将newCursorPosition设置为01,则无关紧要。光标始终位于插入的末尾。例如调用

inputConnection.commitText("aaa", 0);

inputConnection.commitText("aaa", 1);

两者都显示如下光标:

enter image description here

如果我{/ 1}}

-1

我明白了

enter image description here

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

0

enter image description here

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

1 个答案:

答案 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)能够产生您看到的结果。

我没有完全遵循这个位置的代码,但我相信这就是问题所在。我已经跟踪BaseInputConnectionnewCursorPosition = 0和{newCursorPosition = 1的执行路径{1}}在带有API 21的Pixel仿真器上,以及上面列出的内容确实存在。