删除时需要考虑以下几种情况:
- 有一个作曲选择。
- 编辑器/用户在文本上有一个光标选择。
- 没有任何类型的选择。
如果有选择,则应将其删除。如果没有选择,则应该删除光标前面的字符。
解决方案 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 方法,这应该没问题。不过需要注意的是documentation警告
IME 作者:请注意不要只删除一半的代理项
一对。还要注意不要删除比
编辑器,因为这可能会对应用程序产生不良影响。
如果某些自定义视图使用的输入连接不能正确检查文本长度或代理对,那么这可能会导致崩溃。即使这不太可能发生,但如果您使用此解决方案,那么您应该在此处添加额外的检查代码。
这可能是为什么sample Android keyboard 首先检查是否有组成跨度,如果没有,则使用以下解决方案。
解决方案 2
您还可以使用输入连接发送KeyEvent 和KEYCODE_DEL。在我看来,这并不好,因为它是一个伪装成硬键盘的软键盘。但是很多键盘都是这样做的。当我创建custom view that accepted keyboard input 时,我必须将删除作为KeyEvent 处理,也就是说,独立于输入连接(因为输入连接没有删除文本)。
所以只需将删除消息作为KeyEvent 发送(就像您按下硬键盘键然后放开它一样)。
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));
这按预期工作。如果有一个选择,它将删除选择,如果没有选择,它将删除光标后面的一个字符。 (但是,您应该单独处理任何组成跨度。)
感谢this answer 的想法。