Android: Backspace in WebView/BaseInputConnection
Ok, finally figured this out.
In Android 4.2 (maybe in earlier versions as well) the backspace is not sent as a sendKeyEvent(..., KeyEvent.KEYCODE_DEL)
by the standard soft keyboard. Instead, it is sent as deleteSurroundingText(1, 0)
.
So the solution in my case is to make a custom InputConnection
with the following:
@Overridepublic 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);}
Note: Please let me know if I am doing something stupid here, as it is my 3rd day writing for Android.
this code will be better, it work with more keyboard :D
@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { outAttrs.actionLabel = null; outAttrs.inputType = InputType.TYPE_NULL; final InputConnection con = new BaseInputConnection(this,false); InputConnectionWrapper public_con = new InputConnectionWrapper( super.onCreateInputConnection(outAttrs), true) { @Override public boolean deleteSurroundingText(int beforeLength, int afterLength) { if (beforeLength == 1 && afterLength == 0) { return this.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) && this.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL)); } return super.deleteSurroundingText(beforeLength, afterLength); } @Override public boolean sendKeyEvent(KeyEvent event) { if(event.getKeyCode() == KeyEvent.KEYCODE_DEL){ return con.sendKeyEvent(event); }else { return super.sendKeyEvent(event); } } }; try { return public_con ; }catch (Exception e){ return super.onCreateInputConnection(outAttrs) ; } }