检测软键盘中的删除按钮

时间:2012-08-23 01:23:51

标签: android android-edittext android-softkeyboard

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

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:9)

Android EditText delete(backspace) key event

可能重复

刚刚检查了该问题的代码(实际上来自提供的问题并由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;
        }
    });

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

<强>更新 似乎这种方式不适用于最新版本(至少在4.1之后)的Android版本。 This answer似乎适用于4.1之后的版本。

答案 1 :(得分: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 });

可以使用enddStartdEnd评估退格事件。如果删除了某个字符,dStart将始终小于dEnd。如果EditText为空,您仍然可以通过检查end == 0来评估退格键。

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

答案 2 :(得分:4)

使用https://github.com/ciasaboark/Android-Shell/blob/master/src/com/example/com/programmingthetux/tutorial/ZanyEditText.java

时提供的扩展程序
import java.util.Random;

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputConnectionWrapper;
import android.widget.EditText;
/**
 * Created by mkallingal on 4/25/2016.
 */
public class CustomEditText extends EditText {

    private Random r = new Random();

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomEditText(Context context) {
        super(context);
    }

    public void setRandomBackgroundColor() {

    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
                true);
    }

    private class ZanyInputConnection extends InputConnectionWrapper {

        public ZanyInputConnection(InputConnection target, boolean mutable) {
            super(target, mutable);
        }

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN
                    && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
                CustomEditText.this.setRandomBackgroundColor();
                // Un-comment if you wish to cancel the backspace:
                // return false;
            }
            return super.sendKeyEvent(event);
        }


        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) {
            // magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
            if (beforeLength == 1 && afterLength == 0) {
                // backspace
                return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                        && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
            }

            return super.deleteSurroundingText(beforeLength, afterLength);
        }

    }
}

现在你可以在你的Activity中使用它,如下所示:

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;
                    }
                });

答案 3 :(得分:1)

我通过覆盖EditText来实现它,以便访问包含InputConnection方法的deleteSurroundingText对象。它有助于检测删除(退格)事件。请看一下我在那里提供的解决方案:Android - cannot capture backspace/delete press in soft. keyboard

此解决方案适用于hardKeyboard和softKeyboard。