Android 检测软键盘中的删除按钮

Android 检测软键盘中的删除按钮,android,android-edittext,android-softkeyboard,Android,Android Edittext,Android Softkeyboard,我有两个EditText(每个只接受一个字符),我希望像处理只有一个字段一样处理这两个字段 当用户在第一个文本中写入字符时,我使用TextWatcher在第二个文本中设置焦点,但我不知道如何做相反的事情 如果用户在second EditText(此EditText为空)中按下delete按钮,我希望将焦点移动到first EditText并删除其中的字符 问题是,当用户试图删除一个空字段时,TextWatcher不起作用(因为事实上没有任何变化)。onKeyDown事件只适用于硬键盘,所以我不知

我有两个EditText(每个只接受一个字符),我希望像处理只有一个字段一样处理这两个字段

当用户在第一个文本中写入字符时,我使用TextWatcher在第二个文本中设置焦点,但我不知道如何做相反的事情

如果用户在second EditText(此EditText为空)中按下delete按钮,我希望将焦点移动到first EditText并删除其中的字符

问题是,当用户试图删除一个空字段时,TextWatcher不起作用(因为事实上没有任何变化)。onKeyDown事件只适用于硬键盘,所以我不知道如何处理这个问题

谢谢

只检查了测试项目中该问题的代码(实际上来自提供的问题,由Labeeb p回答),只对布局进行了两次编辑,它似乎工作得很好-即使编辑为空,我也能收到delete

    final EditText edit1 = (EditText) findViewById(R.id.editText1);

    edit1.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // You can identify which key pressed buy checking keyCode value
            // with KeyEvent.KEYCODE_
            if (keyCode == KeyEvent.KEYCODE_DEL) {
                // this is for backspace
                Log.e("IME_TEST", "DEL KEY");
            }
            return false;
        }
    });
似乎android的EditText文档应该更加清晰,或者至少提供EditText-软键盘交互的任何指南,因为有许多典型的文档应该由几乎每个开发人员编写

更新:
这种方式似乎不适用于最新(至少在4.1之后)的Android版本。似乎对4.1之后的版本有效。

我通过覆盖
EditText
来实现它,以便访问
InputConnection
对象,该对象包含
deleteSurroundingText
方法。它有助于检测删除(退格)事件。请看一看我提供的解决方案:


此解决方案适用于硬键盘和软键盘。

请使用

现在,您可以在活动中使用它,如下所示:

final CustomEditText editText = new CustomEditText(cxt);

editText.setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if (keyCode == KeyEvent.KEYCODE_DEL) {
                            String _text= editText.getText().toString();
                            if(StringUtils.isBlank(_text))
                                 //editText is now empty
                            }
                        }
                        return false;
                    }
                });

我偶然发现的一个更简单的解决方案是使用。InputFilter的
filter()
方法似乎可以报告所有软键盘事件,即使是EditText值没有改变的事件

因此,为了解决您的具体情况,请构造一个输入过滤器并相应设置:

private InputFilter filter = (charSequence, start, end, dest, dStart, dEnd) -> {

    if (end == 0 || dStart < dEnd) {
        // backspace was pressed! handle accordingly
    }

    return charSequence;
};

...

myEditText.setFilters(new InputFilter[] { filter });
private InputFilter filter=(charSequence、start、end、dest、dStart、dEnd)->{
if(end==0 | | dStart
可以使用
end
dStart
dEnd
评估退格事件<如果删除了某个字符,则代码>数据起始
将始终小于
dEnd
。如果
EditText
为空,您仍然可以通过检查
end
==0来评估退格按压


请注意,此
if
语句也会捕获批量删除,因此您可能需要使用
filter()
进行一些额外的检查。还请注意,如果您使用计算机键盘在模拟器中键入编辑文本,则可能会得到意外的结果。最好单击软件按钮进行测试。

您是否尝试过在带有硬件键盘的设备上按下键?您需要回接或删除按键吗?后面有个类似的问题是的,我试过用onKeyDown。。。但是我需要抓住软键盘上的删除按钮。如果用户在second edittext中按delete按钮,焦点将显示在second edittext中(并且edittext为空),那么焦点将转到first edittext,这很奇怪,因为我已经检查过它(6个多月前),它在nexus one设备上运行良好。在4.2.2上也不正常,但在Android stock虚拟键盘上不工作。我也有快捷键键盘,我可以在OnKeyListener上接收KEYCODE\u DEL。看来,这个答案可以解决这个问题。@DJphy 1。我自己检查过答案,不确定你是否检查过任何东西。2.如果可以并且可以接受,请提供更好的答案。将硬件密钥事件分派到此视图时调用回调的接口定义。回调将在键事件提供给视图之前调用。这只对硬件键盘有用;软件输入法没有义务触发此侦听器。不起作用。尝试此操作仅在您从编辑文本中删除最后一个cha时调用。但当用户在空编辑文本上按delete键时,不会得到它。@John感谢您的提醒。我更新了答案以正确报告。R.e.在空白编辑文本上按delete键,这是在真实手机或模拟器上发生的吗?如果您使用计算机的“退格”触发删除,则可能会得到意外的结果。最好手动单击仿真器的软件按钮。@AlexOlsen在nexus 5x设备上试用过,确认有效!!这应该是最好的答案。你能用一个简短的例子说明它是如何实现的吗
private InputFilter filter = (charSequence, start, end, dest, dStart, dEnd) -> {

    if (end == 0 || dStart < dEnd) {
        // backspace was pressed! handle accordingly
    }

    return charSequence;
};

...

myEditText.setFilters(new InputFilter[] { filter });