893 votes

Comment afficher du HTML dans un TextView ?

J'ai de simples HTML :

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

Je veux afficher du texte stylé en HTML en TextView . Comment faire ?

8 votes

Voulez-vous afficher les balises ou les omettre ?

1 votes

Consultez ce lien pour un exemple fonctionnel javatechig.com/2013/04/07/how-to-display-html-in-Android-view

1 votes

Si vous cherchez la solution de l'obsolescence, c'est ici. stackoverflow.com/questions/37904739/

1587voto

David Hedlund Points 66192

Vous devez utiliser Html.fromHtml() pour utiliser le langage HTML dans vos chaînes XML. Le simple fait de référencer une chaîne avec du HTML dans votre mise en page XML ne fonctionnera pas.

Voici ce que vous devez faire en Java

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

Et en Kotlin :

textView.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT)
} else {
    Html.fromHtml(html)
}

0 votes

Quand je mets ces lignes, un vide se produit entre h2 et p, même si j'ai supprimé br mais il y a toujours un vide... comment le résoudre ?

9 votes

h2 par définition, crée beaucoup de marge autour de lui-même. et p est également livré avec une certaine marge. Si vous ne voulez pas de marge, vous pouvez envisager d'utiliser d'autres éléments html.

0 votes

Comment puis-je définir un texte html dans l'attribut style du contrôle textview ? Cela ne fonctionnera probablement pas.

89voto

Shohan Ahmed Sijan Points 2304

setText(Html.fromHtml(bodyData)) est déprécié après api 24. Maintenant vous devez faire ça :

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

5 votes

Pourquoi utiliser FROM_HTML_MODE_LEGACY dans l'API 24+ ?

0 votes

Cela m'aide beaucoup. Mais toutes les balises ne sont pas encore prises en charge arkapp.medium.com/Android-set-html-in-text-view-b912e1a96b21

74voto

Jetez un coup d'oeil là-dessus : https://stackoverflow.com/a/8558249/450148

C'est assez bon aussi !

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

Cela ne fonctionne que pour quelques balises.

13 votes

Existe-t-il une liste des balises prises en charge par cette méthode ?

26 votes

@mente Selon codes sources : <a>, <b>, <big>, <blockquote>, <br>, <cite>, <dfn> <div align="...">, <em>, <font size="..." color=".... " face="..."> <h1-6>, <i>, <img src="...">, <p>, <small> <strike>, <strong>, , <sup>, <tt>, <u>(source : dzone.com/snippets/how-display-html-Android )

0 votes

@JerabekJakub mais attention, si vous allez gérer des img vous devez implémenter Html.ImageGetter.

46voto

user1299412 Points 129

Si vous voulez être en mesure de le configurer par le biais de xml sans aucune modification du code java, vous pouvez trouver cette idée utile. Il suffit d'appeler init depuis le constructeur et de définir le texte comme 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"/>

2 votes

Que signifie "...". Veuillez préciser

0 votes

C'est la solution la plus générique et la plus propre

1 votes

Le plus simple serait de créer simplement un adaptateur de liaison, non ? @BindingAdapter(value = ["htmlText"]) fun TextView.setHtmlText(string : String ?) { text = HtmlCompat.fromHtml(string? :"", HtmlCompat.FROM_HTML_MODE_COMPACT) }

39voto

Phileo99 Points 319

Si vous essayez d'afficher du HTML à partir d'un identifiant de ressource de type chaîne, le formatage peut ne pas apparaître à l'écran. Si c'est le cas, essayez d'utiliser des balises CDATA à la place :

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

Voir ceci poste pour plus de détails.

0 votes

Merci, cela a fonctionné pour moi - en utilisant l'API 23.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X