Can';t在Android上删除contenteditable div中的图像

Can';t在Android上删除contenteditable div中的图像,android,webview,contenteditable,richtext,Android,Webview,Contenteditable,Richtext,我正在android中构建一个富文本编辑器。为此,我将webView与contentEditable div一起使用。 要添加样式,我调用JavaScript。这一切都很好,除非我调用JavaScript插入图像或水平规则。当我使用JavaScript插入这些内容时,如果我尝试按back按钮删除图像或水平规则,则无法工作 奇怪的是,如果我先输入任何其他字符,然后插入图像或水平规则,我可以很好地删除图像/水平规则,但不能删除紧跟在图像/水平规则之前输入的字符 我试过在每个州打印HTML,检查选择/

我正在android中构建一个富文本编辑器。为此,我将
webView
contentEditable div一起使用。

要添加样式,我调用
JavaScript
。这一切都很好,除非我调用JavaScript插入图像或水平规则。当我使用JavaScript插入这些内容时,如果我尝试按back按钮删除图像或水平规则,则无法工作

奇怪的是,如果我先输入任何其他字符,然后插入图像或水平规则,我可以很好地删除图像/水平规则,但不能删除紧跟在图像/水平规则之前输入的字符


我试过在每个州打印HTML,检查选择/范围等,但似乎找不到任何与该州不同的地方来解释为什么我不能删除图像等。

我使用
WebView
JavaScript
实现了richTextEditor

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

String exeSucess = "document.execCommand('insertHtml', false,'<img src=\""
        + selectedImagePath + "\" height=auto width=200 ></img>');";
   //Then code for executing this javascript.
String exeSucess=“document.execCommand('insertHtml',false',);”;
//然后是执行此javascript的代码。
谢谢。

子类Webview并重写该方法,如这家伙的问题所示

在一些手机上,只有男士的问题才能满足要求。该链接的答案将完成与其他手机兼容的代码。不过,您可以将InputConnectionWrapper子类化。没有输入连接。然后在自定义webview中返回该包装

仅供参考,此链接对情况有更详细的解释,但我尝试快速实施他们的想法,但没有成功。也许对我来说太复杂了。我之所以尝试他们的解决方案而不是我上面提到的,是因为我上面提到的解决方案导致语音到文本功能无法正常工作。

您已经意识到我覆盖了
sendKeyEvent
,我自己处理
Delete

这是
delete()
函数

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

你能试着为我们提供一些关于你是如何编码HTML+Javascript和Android Java代码(我猜是WebChromeClient)的信息吗?你提供的信息不够精确,我猜,因为你在幕后有HTML,你的退格实际上删除了标记的最后一部分(这是enoguh停止显示)并且您无法在项目之前删除视觉上的内容的原因是,进一步按backspace删除更多的标记。例如,
显示,然后显示backspace,您已经显示了一些JS代码,显示了一些示例div内容()您应该实现并向div添加一个事件侦听器,该侦听器知道如何删除完整的HTML元素,例如,在按Backspace或delete时。使用光标删除图像时没有任何问题吗?我在执行此操作时遇到各种各样的问题。我尝试重写deleteSurroundingText方法,该方法在堆栈上有许多其他线程这很有意思,但并没有什么运气。当覆盖它时,它破坏了所有的自动完成状态,所以会频繁插入或删除随机字符——这显然是一个大问题。我可以通过执行上面的javascript插入图像,也可以通过按下软键盘上的backpress按钮来删除图像。在nexus、htc one v上工作,但在非常短的时间内低端设备它有一些卡住的问题。请,请,请更改您的格式。谢谢。
@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);
    }
}
public void delete(){
  loadurl("javascript:document.execCommand('delete', false, null);");
}