372 votes

Html.fromHtml déprécié dans Android N

J'utilise Html.fromHtml pour afficher le html dans un TextView .

Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);

Mais Html.fromHtml est désormais obsolète dans Android N+.

Quoi/comment trouver la nouvelle façon de faire ?

756voto

Rockney Points 5325

mise à jour : comme @Andy mentionné ci-dessous Google a créé HtmlCompat qui peut être utilisé à la place de la méthode ci-dessous. Ajoutez cette dépendance implementation 'androidx.core:core:1.0.1 au fichier build.gradle de votre application. Assurez-vous d'utiliser la dernière version de androidx.core:core .

Cela vous permet d'utiliser :

HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);

Vous pouvez en savoir plus sur les différents drapeaux sur le site Web de la Commission européenne. HtmlCompat-documentation

réponse originale : Dans Android N, ils ont introduit une nouvelle Html.fromHtml méthode. Html.fromHtml requiert désormais un paramètre supplémentaire, nommé flags. Ce paramètre vous donne plus de contrôle sur la façon dont votre HTML est affiché.

Sur Android N et supérieur, vous devez utiliser cette nouvelle méthode. L'ancienne méthode est dépréciée et pourrait être supprimée dans les futures versions d'Android.

Vous pouvez créer votre propre méthode utilitaire qui utilisera l'ancienne méthode sur les anciennes versions et la nouvelle méthode sur Android N et les versions supérieures. Si vous n'ajoutez pas de vérification de la version, votre application se brisera sur les versions inférieures d'Android. Vous pouvez utiliser cette méthode dans votre classe Util.

@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
    if(html == null){
        // return an empty spannable if the html is null
        return new SpannableString("");
    }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
        // we are using this flag to give a consistent behaviour
        return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
    } else {
        return Html.fromHtml(html);
    }
}

Vous pouvez convertir le HTML.FROM_HTML_MODE_LEGACY dans un paramètre supplémentaire si vous le souhaitez. Cela vous donne plus de contrôle sur le drapeau à utiliser.

Vous pouvez en savoir plus sur les différents drapeaux sur le site Web de la Commission européenne. Documentation sur les classes Html

2 votes

Quel drapeau le zéro représente-t-il ?

5 votes

Html.FROM_HTML_MODE_LEGACY

20 votes

Ah, j'attends que quelque chose comme HtmlCompat apparaisse

98voto

k2col Points 1779

J'avais beaucoup de ces avertissements et j'utilise toujours FROM_HTML_MODE_LEGACY. J'ai donc créé une classe d'aide appelée HtmlCompat contenant ce qui suit :

   @SuppressWarnings("deprecation")
   public static Spanned fromHtml(String source) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
        } else {
            return Html.fromHtml(source);
        }
    }

2 votes

Même effet que la réponse acceptée, mais +1 à cause de l'annotation SuppressWarnings

0 votes

Pouvez-vous donner une petite explication sur ce mode ?

0 votes

Pourriez-vous fournir tout HtmlCompact peut être sur le hub git il semble cool

73voto

Xan Points 1538

Comparez les drapeaux de fromHtml().

<p style="color: blue;">This is a paragraph with a style</p>

<h4>Heading H4</h4>

<ul>
   <li style="color: yellow;">
      <font color=\'#FF8000\'>li orange element</font>
   </li>
   <li>li #2 element</li>
</ul>

<blockquote>This is a blockquote</blockquote>

Text after blockquote
Text before div

<div>This is a div</div>

Text after div

FROM_HTML FLAGS

0 votes

Pouvez-vous s'il vous plaît partager l'entrée HTML également ? Cela aiderait à mieux comprendre la conversion.

0 votes

Je vois que les attributs de style ne sont pas implémentés, y a-t-il un moyen de les implémenter ?

29voto

Leo Droidcoder Points 5410

Si vous avez la chance de développer sur Kotlin, créez simplement une fonction d'extension :

fun String.toSpanned(): Spanned {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
    } else {
        @Suppress("DEPRECATION")
        return Html.fromHtml(this)
    }
}

Et ensuite, c'est si gentil de l'utiliser partout :

yourTextView.text = anyString.toSpanned()

5 votes

Vous pouvez économiser des frappes en supprimant Spanned et return

16voto

IntelliJ Amiya Points 672

fromHtml

Cette méthode a été déprécié sur Niveau 24 de l'API .

Vous devez utiliser FROM_HTML_MODE_LEGACY

Séparez les éléments de niveau bloc par des lignes vides (deux caractères newline ) entre les deux. Il s'agit du comportement antérieur à N.

Code

if (Build.VERSION.SDK_INT >= 24)
        {
            etOBJ.setText(Html.fromHtml("Intellij \n Amiyo",Html.FROM_HTML_MODE_LEGACY));

         }
 else
        {
           etOBJ.setText(Html.fromHtml("Intellij \n Amiyo"));
        }

Pour Kotlin

fun setTextHTML(html: String): Spanned
    {
        val result: Spanned = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
        } else {
            Html.fromHtml(html)
        }
        return result
    }

Appelez

 txt_OBJ.text  = setTextHTML("IIT Amiyo")

0 votes

Pouvez-vous donner une petite explication sur ce mode ?

0 votes

Si vous voulez que le SDK gère les contrôles de version, utilisez : HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)

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