检测软键盘中的删除按钮

mic*_*erl 19 android android-softkeyboard android-edittext

我有两个EditText(每个只接受一个字符),我想处理两个字段,就像我只有一个.

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

如果用户按下第二个EditText中的删除按钮(此EditText为空),我想将焦点移动到第一个EditText并删除那里的字符.

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

谢谢!

san*_*tar 12

可能重复Android EditText删除(退格)键事件

刚刚检查了该问题的代码(实际上来自提供的问题并由Labeeb P回答)和测试项目,只需对布局进行两次编辑,它似乎工作得很好 - 即使编辑是,我也能够收到删除空.

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

似乎应该使EditText的android文档更加清晰,或者至少提供EditText的任何指南 - 提供软键盘交互,因为有许多典型的应该由几乎每个开发人员解决.

更新: 似乎这种方式不适用于最新(至少在4.1之后)Android版本.这个答案似乎适用于4.1之后的版本.


Ale*_*sen 8

我偶然发现的一个更简单的解决方案是使用InputFilter.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 });
Run Code Online (Sandbox Code Playgroud)

Backspace键事件可以使用进行评估end,dStartdEnd.dStart将永远小于dEnd删除字符的时间.如果EditText为空,您仍然可以通过检查end== 0 来评估退格按.

请注意,批量删除也将在此if语句中捕获,因此您可能需要进行一些额外的检查filter().另请注意,如果您使用计算机键盘在模拟器中键入EditTexts,则可能会出现意外结果.最好点击软件按钮进行测试.