Frage

Ich habe einfach HTML :

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

Ich möchte, HTML-Text gestylt es in TextView. Wie dies zu tun?

War es hilfreich?

Lösung

Sie müssen Html.fromHtml() HTML in XML-Strings zu verwenden. einen String mit HTML in Ihrem Layout XML einfach Referenzierung wird nicht funktionieren.

Dies ist, was Sie tun sollten:

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

Andere Tipps

setText (Html.fromHtml (bodyData)) ist deprecated nach api 24. Jetzt haben Sie, dies zu 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));
 }

Werfen Sie einen Blick auf diese: https://stackoverflow.com/a/8558249/450148

Es ist 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.

Wenn Sie in der Lage sein wollen, dass es ohne Änderungen in Java-Code durch xml konfigurieren Sie diese Idee hilfreich sein können. Rufen Sie einfach Sie von Konstruktor init und den Text als html

gesetzt
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"/>

Der Code unten gab 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);

Wenn Sie HTML aus einer String-Ressource-ID zu zeigen versuchen, kann die Formatierung zeigt nicht auf dem Bildschirm nach oben. Wenn das mit Ihnen geschieht, versuchen Sie es mit CDATA-Tags statt:

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

Sehen Sie diese Post für weitere Details.

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

Wenn Sie nur einige HTML-Text angezeigt werden soll und nicht wirklich brauchen eine TextView, dann eine WebView nehmen und verwenden Sie es wie folgt:

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

Dies schränkt Sie ein paar HTML-Tags entweder.

Der beste Ansatz CDATA-Abschnitte für die Zeichenfolge in strings.xml-Datei zu verwenden, um eine aktuelle Anzeige des HTML-Inhalts an den Textview der folgenden Code erhält Schnipsel werden Sie die gute Vorstellung.

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

CDATA-Abschnitt in Zeichenfolge Text hält die HTML-Tag-Daten erhalten, auch nach Textformatierung String.format Methode. Also, Html.fromHtml (str) funktioniert gut, und Sie werden den fett gedruckten Text in Begrüßungsmeldung.

Ausgang:

  

Willkommen, um Ihre Lieblingsmusik App Store. Angemeldet als: username

Es ist erwähnenswert, dass die Methode Html .fromHtml (String source) als der API-Ebene ist veraltet 24. Wenn das Ihre Ziel API, sollten Sie Html.fromHtml (String Quelle, int flags) statt.

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

Die Verwendung ist fast die gleiche wie Standard-Android-Konverter:

(new HtmlSpanner()).fromHtml()

es gefunden, nachdem ich durch eine eigene Implementierung von HTML zu spannable Konverter bereits begonnen, da Standard Html.fromHtml nicht genug Flexibilität gegenüber der Kontrolle nicht bieten Rendering und auch keine Möglichkeit zur Verwendung von benutzerdefinierten Schriftart TTF

Einfache Verwendung Html.fromHtml("html string"). Das wird funktionieren. Wenn der String-Tags wie <h1> hat dann Räume kommen. Aber wir können nicht diese Räume beseitigen. Wenn Sie noch die Räume entfernen möchten, dann können Sie die Tags in der Zeichenfolge entfernen und übergeben Sie die Zeichenfolge an die Methode Html.fromHtml("html string");. Auch im Allgemeinen dieser Strings kommen vom Server (dynamisch), aber nicht oft, wenn es den Fall besser ist, die Zeichenfolge übergibt, wie es zu dem Verfahren als Versuch ist die Tags aus der Zeichenfolge zu entfernen.

String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)

Erstellen 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 verwenden / Fragment wie:

text_view.setText(stripHtml(htmlText));

Ich habe diese mit Web-Ansicht implementiert. In meinem Fall habe ich zu laden Bild von URL zusammen mit dem Text in der Textansicht 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);

Es wird über verschiedene Antworten vorgeschlagen worden, das Html Framework-Klasse wie hier vorgeschlagen, aber leider hat diese Klasse ein anderes Verhalten in verschiedenen Versionen von Android und verschiedene unadressierte Bugs, wie in Fragen demonstriert 214.637 , 14778 , 235128 und 75.953 .

Sie sollten daher eine Kompatibilitätsbibliothek verwenden, um die HTML-Klasse über Android-Versionen zu standardisieren und zurückzuportieren die mehr Rückrufe für Elemente enthält und Styling:

  

Github-Projekt HtmlCompat

Während es auf den Rahmen des Html-Klasse ähnlich ist, wurden einige Änderungen erforderlich Unterschrift mehr Rückrufe zu ermöglichen. Hier die Probe aus 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);

Ich weiß, diese Frage ist alt. Andere Antworten hier darauf hindeutet, Html.fromHtml() Methode. Ich schlage vor, Sie verwenden HtmlCompat.fromHtml() von androidx.core.text.HtmlCompat Paket. Da es sich um rückwärts kompatible Version von Html Klasse.

Beispielcode:

import androidx.core.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 Android API Versionsprüfung vermeiden und es ist einfach zu bedienen (Single Line-Lösung).

Wenn Sie benutzerdefinierte Textansicht grundlegende HTML-Satz-Text-Funktion schreiben, wird eine gewisse Form der Geräte erhalten werden verschwunden.

So wir folgende addtional Schritte tun müssen, machen ist Arbeit

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}
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()));
    }
 }
}

Update von Antwort oben

könnte darauf hindeuten, ich eine etwas hacky aber noch Genie Lösung! Ich habe die Idee von diesem Artikel und angepasst es für Android. Grundsätzlich Sie eine WebView verwenden und fügen Sie den HTML Sie in einem bearbeitbaren div-Tag zeigen und bearbeiten möchten. Auf diese Weise, wenn der Benutzer tippt den WebView die Tastatur angezeigt wird, und ermöglicht die Bearbeitung. Sie Ihnen nur einige JavaScript fügen Sie die editierte HTML und voila zurück zu bekommen!

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 brauche nicht die Höhenänderung Rückruf von der ursprünglichen Lösung, so dass die hier fehlen, aber man kann es leicht hinzufügen, wenn nötig

.

Wenn Sie androidx. * Klassen in Ihrem Projekt verwenden, sollten Sie HtmlCompat.fromHtml(text, flag) verwenden. Quelle des Verfahrens 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 Weg als Html.fromHtml, da es weniger Code ist, nur eine Zeile, und empfohlene Weg, es zu benutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top