4

我为android制作了一个自定义键盘。当我按下键盘的退格键时,我使用

getCurrentInputConnection().deleteSurroundingText(1, 0);

从输入字段中删除一个字母。但是当我选择一些文本然后按退格键时,选定的文本不会被删除。我应该在输入连接中使用什么方法,以便在按下退格按钮时也从键盘中删除选定的文本?

4

2 回答 2

10

删除时需要考虑以下情况:

  • 有一个作曲选择。
  • 编辑器/用户在文本上有一个光标选择。
  • 没有任何选择。

如果有选择,则应将其删除。如果没有选择,则应删除光标前面的字符。

解决方案 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 作者:请注意不要只删除代理对的一半。还要注意不要删除比编辑器中更多的字符,因为这可能会对应用程序产生不良影响。

如果某些自定义视图使用的输入连接不能正确检查文本长度或代理对,那么这可能会导致崩溃。即使这不太可能发生,但如果您使用此解决方案,那么您应该在此处添加额外的检查代码。

这可能是示例 Android 键盘首先检查是否存在组合范围的原因,如果没有,则使用以下解决方案。

解决方案 2

您还可以使用输入连接发送一个KeyEventwith KEYCODE_DEL。在我看来,这并不好,因为它是一个伪装成硬键盘的软键盘。但是很多键盘都是这样做的。当我制作一个接受键盘输入的自定义视图时,我必须将删除处理为一个KeyEvent,也就是说,独立于输入连接(因为输入连接没有删除文本)。

因此,只需将删除消息作为 a 发送KeyEvent(就像您按下硬键盘键然后放开它一样)。

getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));

这按预期工作。如果有一个选择,它将删除选择,如果没有选择,它将删除光标后面的一个字符。(但是,您应该单独处理任何组成跨度。)

感谢这个想法的答案

于 2017-07-19T06:22:50.477 回答
8

称呼getCurrentInputConnection().commitText("",1);

于 2014-12-25T16:08:13.500 回答