【问题标题】:input connection-how to delete selected text?输入连接-如何删除选定的文本?
【发布时间】:2014-08-21 00:16:42
【问题描述】:

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

getCurrentInputConnection().deleteSurroundingText(1, 0);

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    解决方案 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

    您还可以使用输入连接发送KeyEventKEYCODE_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 的想法。

    【讨论】:

    • 第二个解决方案对我有用,而不是出于某种原因第一个解决方案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2019-04-28
      • 2020-03-15
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多