InputConnection.commitText(CharSequence text, int newCursorPosition)
的文档说newCursorPosition
的意思是:
在this example中,如果我输入两个字符,则将光标定位在两个字符之间
然后输入另一个字符,将newCursorPosition
设置为0
还是1
都没关系。光标始终位于插入的末尾。例如打电话
inputConnection.commitText("aaa", 0);
或者
inputConnection.commitText("aaa", 1);
两者都显示光标,如下所示:
如果我用
-1
inputConnection.commitText("aaa", -1);
我明白了
根据文档预期
1
和-1
结果。 为什么0
不将光标放在插入的开头? 我希望0
应该像这样inputConnection.commitText("aaa", 0);
但事实并非如此。为什么不?
最佳答案
这看起来像是代码中的缺陷,但您要当裁判。
看看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 = 0
和newCursorPosition = 1
的执行路径进行了操作,上面概述的内容确实适用。