wake-up-neo.com

Wie kann ich HTML in TextView anzeigen?

Ich habe einfacheHTML:

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

Ich möchte HTML-Text in TextView anzeigen. Wie macht man das?

669
UMAR

Sie müssen Html.fromHtml() verwenden, um HTML in Ihren XML-Strings zu verwenden. Das einfache Verweisen auf einen String mit HTML in Ihrem XML-Layout funktioniert nicht.

Das sollten Sie tun:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
1193
David Hedlund

setText (Html.fromHtml (bodyData)) ist veraltet nach api 24. Jetzt müssen Sie Folgendes tun: 

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

Schauen Sie sich dies an: https://stackoverflow.com/a/8558249/450148

Es ist auch ziemlich gut !!

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

Es funktioniert nur für wenige Tags.

61
Felipe

Wenn Sie es ohne XML-Code-Änderung über XML konfigurieren möchten, ist diese Idee möglicherweise hilfreich. Sie rufen einfach init vom Konstruktor auf und setzen den Text als 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"/>
38
user1299412

Der folgende Code ergab das beste Ergebnis für mich.

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
21

Wenn Sie versuchen, HTML aus einer String-Ressourcen-ID anzuzeigen, wird die Formatierung möglicherweise nicht auf dem Bildschirm angezeigt. Wenn dies bei Ihnen der Fall ist, verwenden Sie stattdessen CDATA-Tags:

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

Weitere Informationen finden Sie in diesem post .

19
Phileo99

Wenn Sie nur etwas HTML-Text anzeigen möchten und keine TextView wirklich benötigen, nehmen Sie eine WebView und verwenden Sie sie wie folgt:

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

Dies beschränkt Sie auch nicht auf einige HTML-Tags.

11
prom85
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
Pedro

Die beste Methode, CData-Abschnitte für die Zeichenfolge in der Datei strings.xml zu verwenden, um eine tatsächliche Anzeige des HTML-Inhalts in der Textansicht zu erhalten. Das folgende Code-Snippet vermittelt Ihnen eine gute Idee.

//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));

Der CData-Abschnitt in String-Text hält die HTML-Tag-Daten auch nach der Formatierung von Text mithilfe der String.format-Methode aufrecht. Html.fromHtml (str) funktioniert also einwandfrei und in der Begrüßungsnachricht wird der fette Text angezeigt.

Ausgabe:

Willkommen in Ihrem Lieblings-App-Store für Musik. Angemeldet als: Benutzername

10

Es ist erwähnenswert, dass die Methode Html.fromHtml (String source) ab API Level 24 nicht mehr verwendet wird. Wenn dies Ihre Ziel-API ist, sollten Sie stattdessen Html.fromHtml (String source, int flags) verwenden.

10
Teo Inke

Ich möchte auch folgendes Projekt vorschlagen: https://github.com/NightWhistler/HtmlSpanner

Die Nutzung ist fast identisch mit dem Standard-Android-Konverter:

(new HtmlSpanner()).fromHtml()

Fand es, nachdem ich bereits mit der eigenen Implementierung von html zu spannbarem Konverter begonnen hatte, da Standard-Html.fromHtml keine ausreichende Flexibilität bei der Rendering-Kontrolle bietet und auch keine Möglichkeit zur Verwendung benutzerdefinierter Schriftarten von ttf

6

Einfache Verwendung Html.fromHtml("html string"). Das wird funktionieren. Wenn der String Tags wie <h1> enthält, werden Leerzeichen eingefügt. Aber wir können diese Räume nicht beseitigen. Wenn Sie die Leerzeichen trotzdem entfernen möchten, können Sie die Tags in der Zeichenfolge entfernen und die Zeichenfolge an die Methode Html.fromHtml("html string"); übergeben. Im Allgemeinen stammen diese Zeichenfolgen vom Server (dynamisch), aber nicht oft, wenn es besser ist, die Zeichenfolge wie sie ist an die Methode zu übergeben, als die Tags aus der Zeichenfolge zu entfernen.

5
java dev
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
4
samuel gildas

Machen Sie eine globale Methode wie:

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

Sie können es auch in Ihrer Aktivität/Fragment verwenden:

text_view.setText(stripHtml(htmlText));
3
Shylendra Madda

Ich habe dies über die Webansicht implementiert. In meinem Fall muss ich ein Bild von der URL zusammen mit dem Text in der Textansicht laden, und das funktioniert für mich.

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
Killer

Es wurde durch verschiedene Antworten vorgeschlagen, die Html - Framework-Klasse wie hier vorgeschlagen zu verwenden, aber leider hat diese Klasse in verschiedenen Versionen von Android und verschiedenen nicht adressierten Fehlern ein unterschiedliches Verhalten, wie in Ausgaben 214637 , gezeigt. 14778 , 235128 und 75953 .

Daher möchten Sie möglicherweise eine Kompatibilitätsbibliothek verwenden, um die Html-Klasse für Android-Versionen zu standardisieren und zurückzuschicken, die weitere Rückrufe für Elemente und Stil enthält:

Github-Projekt HtmlCompat

Obwohl es der Html-Klasse des Frameworks ähnelt, waren einige Signaturänderungen erforderlich, um weitere Rückrufe zuzulassen. Hier ist das Beispiel von der GitHub-Seite:

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
Paul Lammertsma

Ich weiß, dass diese Frage alt ist. Andere Antworten hier schlagen die Html.fromHtml() method vor. Ich empfehle Ihnen, das HtmlCompat.fromHtml() aus dem Android.support.v4.text.HtmlCompat-Paket zu verwenden. Da dies eine abwärtskompatible Version der Klasse Html ist.

Beispielcode:

import Android.support.v4.text.HtmlCompat;
import Android.text.Spanned;
import Android.widget.TextView;

String htmlString = "<h1>Hello World!</h1>";

Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);

TextView tvOutput = (TextView) findViewById(R.id.text_view_id);

tvOutput.setText(spanned);

Auf diese Weise können Sie die Überprüfung der Android-API-Version vermeiden und es ist einfach zu verwenden (Einzeilenlösung).

2
Shashanth

Wenn Sie eine benutzerdefinierte Textansicht schreiben, wird die grundlegende HTML-Textfunktion von einigen Geräten verschwunden.

Wir müssen also die folgenden zusätzlichen Schritte machen, um die Arbeit zu machen 

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}
2
Vinayak
public class HtmlTextView extends AppCompatTextView {

public HtmlTextView(Context context) {
    super(context);
    init();
}

private void init(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
    } else {
        setText(Html.fromHtml(getText().toString()));
    }
 }
}

aktualisierung von Antwort oben

1
Isaac Sekamatte

Darf ich eine etwas hackige, aber dennoch geniale Lösung vorschlagen? Ich habe die Idee von diesem Artikel und für Android angepasst. Grundsätzlich verwenden Sie eine WebView und fügen den HTML-Code, den Sie anzeigen und bearbeiten möchten, in ein editierbares div-Tag ein. Wenn der Benutzer auf die Variable WebView tippt, wird auf diese Weise die Tastatur angezeigt und die Bearbeitung kann erfolgen. Sie fügen nur etwas JavaScript hinzu, um das bearbeitete HTML und voila wiederzuerlangen!

Hier ist der Code:

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

Und hier ist die Komponente als Gist.

Hinweis: Ich habe den Höhenänderungs-Callback der ursprünglichen Lösung nicht benötigt. Das fehlt hier, aber Sie können ihn bei Bedarf problemlos hinzufügen.

0
AXE

Wenn Sie in Ihrem Projekt androidx. * -Klassen verwenden, sollten Sie HtmlCompat.fromHtml(text, flag) verwenden. Quelle der Methode ist:

@NonNull public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) { if (Build.VERSION.SDK_INT >= 24) { return Html.fromHtml(source, flags); } //noinspection deprecation return Html.fromHtml(source); }

Es ist besser als Html.fromHtml, da es weniger Code gibt, nur eine Zeile und die empfohlene Verwendung.

0
pandabear