我想在EditText
自定义上的软键盘中捕获退格/删除按钮事件。
我该怎么做?
我试过这些解决方案,但它们对我不起作用:
Android custom EditText and back button override
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);
}
答案 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.
}
}
编辑:这是未经测试的,因此可能不完全可靠。此外,值得注意的是,如果选择了较长的文本部分然后替换了count
,0
也可能会读取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();
}
}
});