部分键盘del键无法响应onkeyListener事件,包括google原生键盘
之前我们想要在EditText中监听软件盘都会使用以下方法
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
//点击了删除键
}
return false
}
});
但是在实际使用中会发现部分键盘是不相应这个事件的,比如华为和vivo键盘
自定义EditText重写InputConnectionWrapper
public class CodeInputEditText extends EditText {
private OnDelKeyEventListener delKeyEventListener;
public CodeInputEditText(Context context) {
super(context);
}
public CodeInputEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CodeInputEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new ZanyInputConnection(super.onCreateInputConnection(outAttrs), true,this);
}
/**
*重写InputConnectionWrapper
*/
private class ZanyInputConnection extends InputConnectionWrapper {
CodeInputEditText editText;
public ZanyInputConnection(InputConnection target, boolean mutable, CodeInputEditText editText) {
super(target, mutable);
this.editText = editText;
}
/**
* 重新 sendKeyEnvent 通过监听通知外部删除键被点击
*/
@Override
public boolean sendKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
if (delKeyEventListener != null) {
delKeyEventListener.onDeleteClick(editText);
}
}
return super.sendKeyEvent(event);
}
/**
*这个方法必需写在有些情况下删除键只会调用该方法,不会调用sendKeyEvent需要手动调用下
*/
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
return super.deleteSurroundingText(beforeLength, afterLength);
}
}
public void setDelKeyEventListener(OnDelKeyEventListener delKeyEventListener) {
this.delKeyEventListener = delKeyEventListener;
}
public interface OnDelKeyEventListener {
void onDeleteClick(CodeInputEditText editText);
}
}