Domanda

ho semplice HTML :

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

Voglio visualizzare il testo HTML stile in TextView. Come fare questo?

È stato utile?

Soluzione

È necessario utilizzare Html.fromHtml() per usare l'HTML nelle stringhe XML. Semplicemente fa riferimento a una stringa con l'HTML nel layout XML non funzionerà.

Questo è ciò che si dovrebbe fare:

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

Altri suggerimenti

setText (Html.fromHtml (bodyData)) è deprecato dopo api 24. Ora si ha a che fare questo:

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

Dai un'occhiata a questo: https://stackoverflow.com/a/8558249/450148

E 'abbastanza buono !!

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

Funziona solo per poche tag.

Se si vuole essere in grado di configurarlo tramite XML senza alcuna modifica nel codice Java si può trovare questa idea utile. Semplicemente si chiama init dal costruttore e impostare il testo come 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"/>

Il codice di seguito ha dato il miglior risultato per me.

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

Se si sta cercando di mostrare HTML da un ID di risorsa di stringa, la formattazione potrebbe non apparire sullo schermo. Se ciò che sta accadendo a te, provare a utilizzare i tag CDATA invece:

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

inviare per ulteriori dettagli.

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

Se si desidera solo per visualizzare un testo html e non si ha realmente bisogno di un TextView, poi prendere un WebView e usarlo come segue:

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

Questo non si limita a un paio di tag html sia.

L'approccio migliore per utilizzare le sezioni CDATA per la stringa nel file di strings.xml per ottenere una visualizzazione reale del contenuto HTML al TextView il frammento di codice qui sotto vi darà l'idea giusta.

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

sezione CDATA nel testo stringa mantiene i dati dei tag html intatte anche dopo la formattazione del testo utilizzando il metodo String.Format. Così, Html.fromHtml (str) funziona bene e vedrete il testo in grassetto nel messaggio di benvenuto.

Output:

  

Benvenuti, al vostro negozio di musica applicazione preferita. Collegato come: username

Vale la pena ricordare che il metodo Html .fromHtml (fonte String) è deprecato a partire dal livello di API 24. Se questo è il vostro API di destinazione, è necessario utilizzare Html.fromHtml (fonte String, int flags) .

Vorrei anche suggerire seguente progetto: https://github.com/NightWhistler/HtmlSpanner

L'uso è quasi la stessa di default Android converter:

(new HtmlSpanner()).fromHtml()

trovato dopo che ho già iniziato dalla propria implementazione di html al convertitore spannable, a causa di serie Html.fromHtml non offre sufficiente flessibilità sopra il rendering di controllo e addirittura nessuna possibilità di utilizzare caratteri personalizzati da TTF

Uso semplice Html.fromHtml("html string"). Questo funzionerà. Se la stringa ha tag come <h1> poi gli spazi verranno. Ma non possiamo eliminare quegli spazi. Se si desidera continuare a rimuovere gli spazi, quindi è possibile rimuovere i tag nella stringa e poi passare la stringa al metodo Html.fromHtml("html string");. Anche in genere queste stringhe provengono dal server (dinamico) ma non spesso, se è il caso meglio passare la stringa in quanto è il metodo che cercare di rimuovere i tag dalla stringa.

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

Fare un metodo globale come:

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

È inoltre possibile utilizzare nel vostro Attività / Frammento come:

text_view.setText(stripHtml(htmlText));

Ho implementato questo punto di vista web utilizzando. Nel mio caso devo caricare l'immagine da URL insieme al testo in modalità testo e questo funziona per me.

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

E 'stato suggerito attraverso varie risposte di utilizzare la Html framework come suggerito qui, ma purtroppo questa classe ha un comportamento diverso nelle diverse versioni di Android e vari bug non indirizzati, come dimostrato in questioni di 214637 , 14778 , 235128 e 75.953 .

È possibile pertanto consiglia di utilizzare una libreria di compatibilità per standardizzare e backport la classe HTML attraverso le versioni di Android che comprende più callback per gli elementi e lo stile:

  

progetto Github HtmlCompat

Anche se è simile alla classe HTML del quadro, sono stati necessari alcuni cambiamenti di firma per consentire a più callback. Ecco il campione dalla pagina 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);

So che questa domanda è vecchia. Altre risposte qui suggerendo Html.fromHtml() metodo. Io suggerisco di utilizzare HtmlCompat.fromHtml() dalla confezione androidx.core.text.HtmlCompat. Dato che questa è la versione compatibile con le versioni precedenti di classe Html.

Codice di esempio:

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

In questo modo si può evitare di Android controllo della versione API ed è facile da usare (soluzione singola linea).

Ogni volta che si scrive vista testo personalizzato funzione di testo set di HTML di base sarà ottenere sotto forma sparito alcuni dei dispositivi.

Quindi, abbiamo bisogno di fare seguendo i passaggi addtional fanno è un lavoro

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

sopra

Mi permetto di suggerire una soluzione un po 'hacky ma ancora genio! Ho avuto l'idea da questo articolo e adattato per Android. In pratica si utilizza un WebView e inserire il codice HTML che si desidera visualizzare e modificare in un tag div modificabile. In questo modo quando l'utente tocca l'WebView appare la tastiera e permette l'editing. Essi si aggiunge solo un po 'di JavaScript per tornare il codice HTML modificato e voilà!

Ecco il codice:

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

qui è il componente come Gist.

Nota: non ho bisogno la richiamata dislivello dalla soluzione originale in modo che manca qui, ma si possono facilmente aggiungere, se necessario

.

Se si utilizzano le classi androidx. * nel progetto, è necessario utilizzare HtmlCompat.fromHtml(text, flag). Fonte del metodo è:

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

E 'il modo migliore di Html.fromHtml in quanto v'è meno codice, una sola linea, e ha raccomandato modo di usarla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top