Android - 在自定义EditText上捕获退格(删除)按钮

时间:2015-10-06 17:28:09

标签: android input android-edittext

我想在EditText自定义上的软键盘中捕获退格/删除按钮事件。

我该怎么做?

我试过这些解决方案,但它们对我不起作用:

Android custom EditText and back button override

EditText OnKeyDown

Get back key event on EditText

Android EditText delete(backspace) key event

感谢您的帮助!

编辑: 我找到了修复函数DispatchKeyEvent:

的问题
@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN
        && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
     // ... 
    }
    return super.dispatchKeyEvent(event);
}

4 个答案:

答案 0 :(得分:2)

我找到了修复函数DispatchKeyEvent:

的问题
@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN
        && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
        // ... 
    }
    return super.dispatchKeyEvent(event);
}

答案 1 :(得分:0)

从Android中的软输入法捕获关键事件是不可靠的。以下是KeyEvent类的JavaDoc的摘录:

  

由于软输入法可以使用多种创造性的输入方式   文字,无法保证软键盘上的任何按键都会   生成一个关键事件:这由IME自行决定,并且在   不鼓励发送此类事件的事实。你永远不应该依赖   接收软输入法上任何键的KeyEvents。特别是,   默认软件键盘永远不会向任何键事件发送任何键事件   应用程序目标是Jelly Bean或更高版本,并且只会发送事件   对于一些按下删除键和返回键到应用程序   目标冰淇淋三明治或更早。

一种解决方法可能涉及使用TextWatcher。每当EditText中发生删除时,字符数就会下降。

myEditText.addTextChangedListener(this);
//...
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (count == 0) {
        //text was deleted. 
    }
}

编辑:这是未经测试的,因此可能不完全可靠。此外,值得注意的是,如果选择了较长的文本部分然后替换了count0也可能会读取EditText。我创建了一个用于向@Model public class TheatreInfo { ... @Produces @Named public Collection<Seat> getSeats() { return Lists.newArrayList(seats); } ... } 添加撤消/重做功能的库,但也可以identify the difference between text being replaced and deleted,因此如果您需要更高的准确性,这可能对您有用。

答案 2 :(得分:0)

请看一下我在另一个类似主题中提供的解决方案:Android - cannot capture backspace/delete press in soft. keyboard。您需要构建自定义onCreateInputConnection类并覆盖其中的deleteSurroundingText方法。它将允许您访问单击退格时触发的public ViewModelA(ICommonService service) { ... } 事件。我已经在某些设备上对它进行了测试,并希望它也适用于其他设备。试一试并提供反馈。

答案 3 :(得分:0)

你去..

editText.addTextChangedListener(new TextWatcher() {

            private int before;
            private int after;
            private int prevLength;
            private boolean isBackPressed;
            ArrayList<Integer> arrayList;

            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                prevLength = charSequence.length();
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int start, int end, int count) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                isBackPressed = prevLength > editable.length();

                if(isBackPressed){
                    Toast.makeText(getApplicationContext(),"Back",Toast.LENGTH_LONG).show();
                }
            }
        });