转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/37913179
如题目所示,非常诡异的问题,EditText只能输入但是却不能删除!
解决办法参考:http://stackoverflow.com/questions/4886858/android-edittext-deletebackspace-key-event
@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) {
ClearEditTextView edit = ClearEditTextView.this;
String text = edit.getText().toString();
if(text.length() > 0){
String newText = text.substring(0,text.length() - 1);
edit.setText(newText);
Selection.setSelection(edit.getText(), newText.length());
}
return false;
}
return super.sendKeyEvent(event);
}
}
原因是:onKeyListener只能监听硬键盘,当发生软键盘事件的时候,会触发sendKeyEvent。
下面还有人补充说,在WebView中使用EditText的时候,也会有问题,还要重写一个deleteSurroundingText()方法:
@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 super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
&& super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
}
return super.deleteSurroundingText(beforeLength, afterLength);
}原话:It seems that backspace is not sent by an Android system unless it believes there is some text in the .
参考:http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection
今天才发现,是他妈的在底层注册了OnKeyListener,然后很霸气的直接返回了true。奇葩啊!