删除时需要考虑以下情况:
- 有一个作曲选择。
- 编辑者/用户在文本上有光标选择。
- 没有任何类型的选择。
如果有选择,则应将其删除。如果没有选择,则应删除光标前面的字符。
解决方案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 https://android.googlesource.com/platform/frameworks/base/+/56a2301/core/java/android/view/inputmethod/BaseInputConnection.java#207方法,这个应该没问题。然而,应该指出的是,文档 https://android.googlesource.com/platform/frameworks/base/+/56a2301/core/java/android/view/inputmethod/BaseInputConnection.java#207 warns
输入法作者:请注意不要只删除代理的一半
一对。另请注意,删除的字符数不要超过
编辑器,因为这可能会对应用程序产生不良影响。
如果某些自定义视图使用的输入连接无法正确检查文本长度或代理对,则可能会导致崩溃。尽管这不太可能发生,但如果您使用此解决方案,那么您应该在此处添加额外的检查代码。
这可能就是为什么Android 键盘示例 https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java#582首先检查是否存在组合跨度,如果不存在则使用以下解决方案。
解决方案2
您还可以使用输入连接发送KeyEvent
with KEYCODE_DEL
。在我看来,这不太好,因为它是一个伪装成硬键盘的软键盘。但很多键盘都是这样做的。当我在制作一个接受键盘输入的自定义视图 https://stackoverflow.com/a/44342915/3681880,我必须将删除作为KeyEvent
,即独立于输入连接(因为输入连接没有删除文本)。
所以只需将删除消息作为KeyEvent
(就像您按下硬键盘键然后松开一样)。
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));
这按预期工作。如果有选择,则删除该选择;如果没有选择,则删除光标后面的一个字符。 (但是,您应该单独处理任何组合跨度。)
谢谢这个答案 https://stackoverflow.com/a/40749965/3681880为了这个想法。