输入连接 - 如何删除所选文本?

时间:2014-06-30 15:09:17

标签: android ime android-input-method custom-keyword inputconnection

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

getCurrentInputConnection().deleteSurroundingText(1, 0);

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

2 个答案:

答案 0 :(得分:8)

致电getCurrentInputConnection().commitText("",1);

答案 1 :(得分:4)

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

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

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

解决方案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的想法。