Как отобразить HTML в TextView? - PullRequest
       146

Как отобразить HTML в TextView?

702 голосов
/ 22 января 2010

У меня просто HTML :

<h2>Title</h2><br>
<p>description here</p>

Я хочу отобразить текст в стиле HTML в TextView. Как это сделать?

Ответы [ 21 ]

0 голосов
/ 26 сентября 2018

Могу ли я предложить несколько хакерское, но все же гениальное решение! Я получил идею из этой статьи и адаптировал ее для Android. В основном вы используете WebView и вставляете HTML, который хотите показать и редактировать, в редактируемый тег div. Таким образом, когда пользователь нажимает WebView, появляется клавиатура и можно редактировать. Они просто добавляют JavaScript, чтобы вернуть отредактированный HTML и вуаля!

Вот код:

public class HtmlTextEditor extends WebView {

    class JsObject {
        // This field always keeps the latest edited text
        public String text;
        @JavascriptInterface
        public void textDidChange(String newText) {
            text = newText.replace("\n", "");
        }
    }

    private JsObject mJsObject;

    public HtmlTextEditor(Context context, AttributeSet attrs) {
        super(context, attrs);

        getSettings().setJavaScriptEnabled(true);
        mJsObject = new JsObject();
        addJavascriptInterface(mJsObject, "injectedObject");
        setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                loadUrl(
                        "javascript:(function() { " +
                            "    var editor = document.getElementById(\"editor\");" +
                            "    editor.addEventListener(\"input\", function() {" +
                            "        injectedObject.textDidChange(editor.innerHTML);" +
                            "    }, false)" +
                            "})()");
            }
        });
    }

    public void setText(String text) {
        if (text == null) { text = ""; }

        String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
        String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
        loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
        // Init the text field in case it's read without editing the text before
        mJsObject.text = text;
    }

    public String getText() {
        return mJsObject.text;
    }
}

И здесь - это компонент в виде Gist.

Примечание. Мне не требовался обратный вызов для изменения высоты по сравнению с исходным решением, поэтому его здесь нет, но вы можете легко добавить его при необходимости.

...