11

我正在构建一个在 android 中的富文本编辑器。为此,我使用 a webViewwith acontentEditable div.

要添加样式,我调用JavaScript. 这一切都很好,除非我调用 JavaScript 来插入图像或水平线。当我使用 JavaScript 插入这些东西时,如果我尝试按下后退按钮来删除图像或水平线,它就不起作用。

奇怪的是,如果我先输入任何其他字符,然后插入图像或水平线,我可以删除图像/水平线就好了,但不能删除我在图像/水平线之前输入的字符。

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

4

3 回答 3

1

Android:WebView/BaseInputConnection 中的退格键

子类 Webview 并覆盖这个人的问题所示的方法。

在某些手机上,只有那家伙的问题才能满足要求。该链接的答案将完成与其他手机兼容的代码。但是,您将 InputConnectionWrapper 子类化。不是输入连接。然后在您的自定义 webview 中返回该包装器。

仅供参考,此链接对情况有更详细的解释,但是我尝试快速实施他们的想法,但没有奏效。也许对我的目的来说太复杂了。我尝试他们的解决方案而不是我上面提到的原因是因为我上面提到的解决方案导致语音转文本功能无法正常工作。 Android - 无法以软方式捕获退格/删除键。键盘

于 2014-07-05T23:09:29.153 回答
0

WebView我已经使用and实现了一个richTextEditor JavaScript

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

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

谢谢。

于 2013-12-31T07:29:55.637 回答
-1
<div contenteditable="true"></div>

我用它在 webview 中做一个富编辑器

TapInputConnection然后在 Webview 中覆盖方法

@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并自己处理DeleteKey

这是delete()功能;

public void delete(){
  loadurl("javascript:document.execCommand('delete', false, null);");
}
于 2016-08-12T09:30:57.100 回答