无法在Android上的contenteditable div中删除图像

我在android中构build一个富文本编辑器。 为此,我正在使用带有contentEditable div.webView contentEditable div.

要添加样式,我调用JavaScript 。 这一切工作正常,除了当我调用JavaScript来插入图像或水平的规则。 当我使用JavaScript插入这些东西,如果我然后尝试按下后退button来删除图像或水平线,这是行不通的。

奇怪的是,如果我第一次input任何其他字符,然后插入图像或水平线,我可以很好地删除图像/水平线,但是不能删除我在图像/水平线之前立即input的字符。

我已经尝试在每个状态下打印HTML,检查select/范围等,似乎无法find任何不同的状态,可以解释为什么我不能删除图像等。

Solutions Collecting From Web of "无法在Android上的contenteditable div中删除图像"

Android:在WebView / BaseInputConnection中退格

子类Webview并重写此人的问题所示的方法。

在某些电话上,只有家伙的问题才能满足要求。 链接的答案将完成与其他手机兼容的代码。 但是,您可以inheritanceInputConnectionWrapper。 没有input连接。 然后在你的自定义webview中返回这个包装器。

只是一个参考,这个环节有一个更详细的情况说明,但是我试图快速实施他们的想法,这是行不通的。 也许我的目的太复杂了。 我尝试他们的解决scheme,而不是我上面提到的原因是因为我上面提到的解决scheme导致语音到文本function无法正常工作。 Android – 无法捕捉退格/删除软按。 键盘

我已经使用WebViewJavaScript实现了一个richTextEditor。

我插入/删除图像,我已经添加到内容可编辑的HTML页面没有问题。 我用来插入图像的代码是

 String exeSucess = "document.execCommand('insertHtml', false,'<img src=\"" + selectedImagePath + "\" height=auto width=200 ></img>');"; //Then code for executing this javascript. 

谢谢。

 <div contenteditable="true"></div> 

我用这个在webview中做一个丰富的编辑器

然后在Webview中覆盖方法TapInputConnection

 @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { return new TapInputConnection(super.onCreateInputConnection(outAttrs)); } class TapInputConnection implements InputConnection { private InputConnection mConnection; public TapInputConnection(InputConnection conn){ this.mConnection = conn; } @Override public CharSequence getTextBeforeCursor(int n, int flags) { return mConnection.getTextBeforeCursor(n, flags); } @Override public CharSequence getTextAfterCursor(int n, int flags) { return mConnection.getTextAfterCursor(n, flags); } @Override public CharSequence getSelectedText(int flags) { return mConnection.getSelectedText(flags); } @Override public int getCursorCapsMode(int reqModes) { return mConnection.getCursorCapsMode(reqModes); } @Override public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) { return mConnection.getExtractedText(request, flags); } @Override public boolean deleteSurroundingText(int beforeLength, int afterLength) { return mConnection.deleteSurroundingText(beforeLength, afterLength); } @Override public boolean setComposingText(CharSequence text, int newCursorPosition) { return mConnection.setComposingText(text, newCursorPosition); } @Override public boolean setComposingRegion(int start, int end) { return mConnection.setComposingRegion(start, end); } @Override public boolean finishComposingText() { return mConnection.finishComposingText(); } @Override public boolean commitText(CharSequence text, int newCursorPosition) { return mConnection.commitText(text, newCursorPosition ); } @Override public boolean commitCompletion(CompletionInfo text) { return mConnection.commitCompletion(text); } @Override public boolean commitCorrection(CorrectionInfo correctionInfo) { return mConnection.commitCorrection(correctionInfo); } @Override public boolean setSelection(int start, int end) { return mConnection.setSelection(start, end); } @Override public boolean performEditorAction(int editorAction) { return mConnection.performEditorAction(editorAction); } @Override public boolean performContextMenuAction(int id) { return mConnection.performContextMenuAction(id); } @Override public boolean beginBatchEdit() { return mConnection.beginBatchEdit(); } @Override public boolean endBatchEdit() { return mConnection.endBatchEdit(); } @Override public boolean sendKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) { if (event.getAction() == KeyEvent.ACTION_UP) { delete(); } return true; } return mConnection.sendKeyEvent(event); } @Override public boolean clearMetaKeyStates(int states) { return false; } @Override public boolean reportFullscreenMode(boolean enabled) { return mConnection.reportFullscreenMode(enabled); } @Override public boolean performPrivateCommand(String action, Bundle data) { return mConnection.performPrivateCommand(action, data); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public boolean requestCursorUpdates(int cursorUpdateMode) { return mConnection.requestCursorUpdates(cursorUpdateMode); } } 

你已经意识到我重写了sendKeyEvent ,我自己处理Delete Key

这是delete()函数;

 public void delete(){ loadurl("javascript:document.execCommand('delete', false, null);"); }