我为android定制了一个键盘。当我按键盘的退格键时,我使用
getCurrentInputConnection().deleteSurroundingText(1, 0);
从输入字段中删除一个字母。但是当我选择一些文本然后按退格键时,所选文本不会被删除。在输入连接中,我应该使用什么方法,以便在按退格键时也从键盘上删除所选文本?
在删除时需要考虑以下情况:
- 有一个组合选择。
- 编辑器/用户在文本上有光标选择。
- 没有任何类型的选择。
如果有一个选择,那么应该删除它。如果没有选择,则应删除光标前面的字符。
解决方案1
一开始我使用这个方法。我喜欢它,因为它只使用输入连接。
CharSequence selectedText = inputConnection.getSelectedText(0);
if (TextUtils.isEmpty(selectedText)) {
// no selection, so delete previous character
inputConnection.deleteSurroundingText(1, 0);
} else {
// delete the selection
inputConnection.commitText("", 1);
}
只要输入连接使用默认的BaseInputConnection.deleteSurroundingText
方法,这应该没问题。但是,应该注意文档警告
IME authors:请注意不要只删除代理的一半对。也要注意不要删除多于字符的字符编辑器,因为这可能会对应用程序产生不良影响。
如果某些自定义视图使用的输入连接没有正确检查文本长度或代理对,那么这可能会导致崩溃。尽管这种情况不太可能发生,但如果您使用这种解决方案,那么您应该在这里添加额外的检查代码。
这可能就是为什么示例Android键盘首先检查是否有一个组合跨度,如果没有,那么它使用以下解决方案。
解决方案2
您也可以使用输入连接发送KeyEvent
与KEYCODE_DEL
。在我看来,这不是很好,因为它是一个软键盘伪装成硬键盘。但是很多键盘都有这个功能。当我制作一个接受键盘输入的自定义视图时,我必须将删除作为KeyEvent
处理,也就是说,独立于输入连接(因为输入连接没有删除文本)。
因此,只需将删除消息作为KeyEvent
发送(就好像您正在按下硬键盘键然后松开它)。
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));
按预期工作。如果有选择,它将删除选择,如果没有选择,它将删除光标后面的一个字符。(但是,您应该单独处理任何组合span。)
感谢这个答案。
呼叫getCurrentInputConnection().commitText("",1);