Jak wyświetlić HTML w TextView?

Mam prosty HTML :

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

Chcę wyświetlić tekst w stylu HTML w TextView. Jak to zrobić?

Author: UMAR, 2010-01-22

18 answers

Musisz użyć Html.fromHtml() aby używać HTML w ciągach XML. Po prostu odwoływanie się do ciągu HTML w układzie XML nie będzie działać.

Na przykład (

myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));

Na przykład (>=Android Nougat):

myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));

Aby odróżnić wersje Androida Użyj Build.VERSION.SDK_INT >= Build.VERSION_CODES.N.

 1129
Author: Timo Bähr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-05 08:48:18

Spójrz na to: https://stackoverflow.com/a/8558249/450148

To jest całkiem dobre!!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>

Działa tylko dla kilku tagów.

 59
Author: Felipe Micaroni Lalli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:50

SetText(Html.fromhtml (bodyData)) jest przestarzałe po api 24. Teraz musisz to zrobić:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
      tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
 } else {
      tvDocument.setText(Html.fromHtml(bodyData));
 }
 59
Author: Shohan Ahmed Sijan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 07:40:04

Jeśli chcesz być w stanie skonfigurować go za pomocą xml bez żadnych modyfikacji w kodzie java może okazać się pomocny. Po prostu wywołujesz INIT z konstruktora i ustawiasz tekst jako html

public class HTMLTextView extends TextView {
    ... constructors calling init...
    private void init(){
       setText(Html.fromHtml(getText().toString()));
    }    
}

Xml:

        <com.package.HTMLTextView
        android:text="@string/about_item_1"/>
 37
Author: user1299412,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-13 20:20:56

Poniższy kod dał mi najlepszy wynik.

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
 21
Author: Rajiv Manivannan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 15:06:46

Jeśli próbujesz wyświetlić kod HTML z identyfikatora zasobu łańcuchowego, formatowanie może nie pojawić się na ekranie. Jeśli tak się dzieje, spróbuj użyć tagów CDATA:

strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>

...

MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));
[[2]}Zobacz ten post aby uzyskać więcej szczegółów.
 16
Author: Phileo99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:36
String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
    SiteLink= (TextView) findViewById(R.id.textViewSite);
    SiteLink.setText(Html.fromHtml(value));
    SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
 11
Author: Pedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-02 13:15:45

Jeśli chcesz po prostu wyświetlić tekst html i nie potrzebujesz TextView, Weź WebView i użyj go w następujący sposób:

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);

Nie ogranicza to również do kilku znaczników html.

 10
Author: prom85,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 13:51:38

Warto wspomnieć, że metoda Html.fromHtml (String source) jest przestarzały od poziomu API 24. Jeśli jest to twoje docelowe API, powinieneś użyć Html.fromHtml (String source, int flags) zamiast.

 10
Author: Teo Inke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 05:31:34

Najlepsze podejście do używania sekcji CData dla Ciągu w łańcuchach.plik xml aby uzyskać rzeczywiste wyświetlanie zawartości html do TextView poniższy fragment kodu daje uczciwy pomysł.

//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>

//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));

Sekcja CData w tekście łańcuchowym zachowuje nienaruszone dane znaczników html nawet po sformatowaniu tekstu za pomocą ciągu Łańcuchowego.metoda formatowania. Więc Html.fromHtml (str) działa dobrze i zobaczysz pogrubiony tekst w wiadomości powitalnej.

Wyjście:

Witaj w swojej ulubionej aplikacji muzycznej sklep. Zalogowany jako: username

 10
Author: Rajendhiran Easu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 11:59:47

Chciałbym również zaproponować następujący projekt: https://github.com/NightWhistler/HtmlSpanner

Użycie jest prawie takie samo jak domyślny konwerter Androida:

(new HtmlSpanner()).fromHtml()

Znalazłem go po tym, jak już zacząłem od własnej implementacji HTML do spannable converter, ponieważ standard Html.fromHtml nie zapewnia wystarczającej elastyczności nad kontrolą renderowania, a nawet nie ma możliwości użycia niestandardowych czcionek z ttf

 6
Author: Fedotchenco Denis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 08:15:43

Proste użycie Html.fromHtml("html string"). To zadziała. Jeśli łańcuch znaków ma znaczniki typu <h1>, to pojawią się spacje. Ale nie możemy wyeliminować tych przestrzeni. Jeśli nadal chcesz usunąć spacje, możesz usunąć znaczniki w łańcuchu, a następnie przekazać łańcuch do metody Html.fromHtml("html string");. Również ogólnie łańcuchy te pochodzą z serwera (dynamiczne), ale nie często, jeśli jest to lepiej przekazać łańcuch tak, jak to jest do metody, niż próbować usunąć znaczniki z łańcucha.

 5
Author: nole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-11 00:01:09
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
 4
Author: samuel gildas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 12:40:40

Zaimplementowałem to używając widoku web. W moim przypadku muszę załadować obraz z adresu URL wraz z tekstem w widoku tekstu i to działa dla mnie.

WebView myWebView =new WebView(_context);
        String html = childText;
        String mime = "text/html";
        String encoding = "utf-8";
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
 3
Author: Killer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-04 11:18:34

Zostało zasugerowane poprzez różne odpowiedzi, aby używać Html klasy framework, jak sugerowano tutaj, ale niestety ta klasa ma inne zachowanie w różnych wersjach Androida i różne nieadresowane błędy, jak pokazano w problemach 214637, 14778, 235128 oraz 75953.

Możesz więc użyć biblioteki zgodności do standaryzacji i backportu klasy Html w wersjach Androida, która zawiera więcej wywołań zwrotnych dla elementy i stylizacja:

Github project HtmlCompat

Chociaż jest podobna do klasy Html frameworka, pewne zmiany podpisu były wymagane, aby umożliwić więcej wywołań zwrotnych. Oto przykład ze strony GitHub:

Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
//        imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
 2
Author: Paul Lammertsma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 08:26:02

Za każdym razem, gdy piszesz niestandardowy widok tekstu, podstawowa funkcja HTML set text zostanie usunięta z niektórych urządzeń.

Więc musimy wykonać następujące dodatkowe kroki make is work

Public class CustomTextView extends TextView {

//Inside constructor

   setText(Html.fromHtml(getText().toString()));

}

 2
Author: Vinayak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 06:10:49

Make a global method like:

public static Spanned stripHtml(String html) {
            if (!TextUtils.isEmpty(html)) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
                } else {
                    return Html.fromHtml(html);
                }
            }
            return null;
        }

Możesz go również użyć w swojej aktywności/fragmencie:

text_view.setText(stripHtml(htmlText));
 0
Author: Shylendra Madda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 16:39:24

Pozwolę sobie zaproponować nieco chwiejne, ale wciąż genialne rozwiązanie! Pomysł zaczerpnąłem z tego artykułu i zaadaptowałem go na Androida. Zasadniczo używasz WebView i wstawiasz HTML, który chcesz pokazać i edytować w edytowalnym znaczniku div. W ten sposób, gdy użytkownik dotknie WebView, pojawi się klawiatura i umożliwi edycję. Oni po prostu dodać trochę JavaScript, aby odzyskać edytowany HTML i voila!

Oto kod:

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;
    }
}

I tutaj jest składnikiem jako Gist.

Uwaga: I nie trzeba zmiany wysokości oddzwaniania z oryginalnego rozwiązania, więc brakuje tutaj, ale można łatwo dodać go w razie potrzeby.

 0
Author: AXE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 07:10:30