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

ish*_*sht 4 android ime android-input-method custom-keyword inputconnection

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

getCurrentInputConnection().deleteSurroundingText(1, 0);
Run Code Online (Sandbox Code Playgroud)

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

Sur*_*gch 9

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

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

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

解决方案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);
}
Run Code Online (Sandbox Code Playgroud)

只要输入连接使用默认BaseInputConnection.deleteSurroundingText方法,这应该没问题。但是,应该注意的是,文档警告

IME 作者:请注意不要只删除代理对的一半。还要注意不要删除比编辑器中更多的字符,因为这可能会对应用程序产生不良影响。

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

这可能就是为什么示例 Android 键盘首先检查是否有组合跨度,如果没有,则使用以下解决方案进行检查。

解决方案2

您还可以使用输入连接发送KeyEvent带有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));
Run Code Online (Sandbox Code Playgroud)

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

感谢这个想法的答案


Osw*_*ald 8

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