我正在制作custom keyboard并且必须在提交之前设置撰写文本。这在this Q&A。
中有所描述我知道如何提交一般文字
inputConnection.commitText("text", 1);
但是如果用户通过触摸EditText
的另一部分来更改光标位置,我不知道如何提交它。从观察其他键盘我知道它是可能的,因为他们这样做。但是在我的键盘上,如果我有
inputConnection.setComposingText("text", 1);
然后改变光标位置,留下构图范围。任何将来的更改都将替换组成范围,而不是在新光标位置输入。
帖子Android EditText listener for cursor position change提供了一些关于您可以对EditText
做些什么的建议,但在自定义键盘内我无法访问EditText
,除了InputConnection
1}}给了我。
如何知道光标/选择何时移动?
我keep在我开始编写问题后找到问题的答案。我将在下面发布答案。
答案 0 :(得分:1)
int candStart = -1;
int candEnd = -1;
if (mTextView.getText() instanceof Spannable) {
final Spannable sp = (Spannable) mTextView.getText();
candStart = EditableInputConnection.getComposingSpanStart(sp);
candEnd = EditableInputConnection.getComposingSpanEnd(sp);
}
答案 1 :(得分:0)
编辑器(EditText
等)在updateSelection
上调用InputMethodManager
,onUpdateSelection
会通知finishComposingText
听众。因此,键盘可以覆盖onUpdateSelection
并处理那里未完成的组合范围。
要处理未完成的作曲范围,您可以使用InputConnection
上的sample Android soft keyboard。这将删除撰写范围并提交范围内的任何文本。
以下是id
command:
/**
* Deal with the editor reporting movement of its cursor.
*/
@Override public void onUpdateSelection(int oldSelStart, int oldSelEnd,
int newSelStart, int newSelEnd,
int candidatesStart, int candidatesEnd) {
super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd,
candidatesStart, candidatesEnd);
// If the current selection in the text view changes, we should
// clear whatever candidate text we have.
if (mComposing.length() > 0 && (newSelStart != candidatesEnd
|| newSelEnd != candidatesEnd)) {
mComposing.setLength(0);
updateCandidates();
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.finishComposingText();
}
}
}