web-dev-qa-db-fra.com

Html.fromHtml déconseillé dans Android N

J'utilise Html.fromHtml pour afficher le code HTML dans une TextView.

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

Mais Html.fromHtml est maintenant obsolète dans Android N +

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

220
Aldasa

Vous devez ajouter une vérification de version et utiliser l'ancienne méthode sur Android M et inférieur, sur Android N et supérieur, vous devez utiliser la nouvelle méthode. Si vous n’ajoutez pas de version, votre application ne fonctionnera pas avec 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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
       return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
    } else {
       return Html.fromHtml(html);
    }
}

Paramètres du drapeau:

public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;

Vous pouvez en savoir plus sur les différents drapeaux sur le fichier Documentation de la classe HTML

474
Rockney

J'ai eu beaucoup de ces avertissements et j'utilise toujours FROM_HTML_MODE_LEGACY alors j'ai créé une classe d'assistance appelée HtmlCompat contenant les éléments suivants:

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

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

48
Xan

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 puis c'est si bon de l'utiliser partout: 

yourTextView.text = anyString.toSpanned()
23
Leo Droidcoder

Ou vous pouvez utiliser androidx.core.text.HtmlCompat:

HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)

Documents HtmlCompat

14
Andy

fromHtml

Cette méthode était obsolète dans niveau API 24.

Vous devez utiliser FROM_HTML_MODE_LEGACY

Séparez les éléments de niveau bloc par des lignes vides (deux caractères de nouvelle ligne ). C'est le comportement de l'héritage avant 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
    }

Appel

 txt_OBJ.text  = setTextHTML("IIT Amiyo")
12
IntelliJ Amiya

Du doc ​​officiel:

La méthode fromHtml(String) était obsolète dans l'API de niveau 24. Utilisez fromHtml(String, int) au lieu.

  1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVE Option pour toHtml(Spanned, int): retourne des lignes de texte consécutives délimitées par '\n' dans <p> éléments.

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL Option pour toHtml(Spanned, int): placez chaque ligne de texte délimitée par '\n' dans un <p> ou un <li> élément.

https://developer.Android.com/reference/Android/text/Html.html

7
USKMobility

Juste pour étendre la réponse de @Rockney et @ k2col, le code amélioré peut ressembler à ceci:

@NonNull
public static Spanned fromHtml(@NonNull String html) {
    if (CompatUtils.isApiNonLowerThan(VERSION_CODES.N)) {
        return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
    } else {
        //noinspection deprecation
        return Html.fromHtml(html);
    }
}

Où le CompatUtils.isApiNonLowerThan:

public static boolean isApiNonLowerThan(int versionCode) {
    return Build.VERSION.SDK_INT >= versionCode;
}

La différence est qu’il n’ya pas de variable locale supplémentaire et que la dépréciation n’est que dans la branche else. Donc, cela ne supprimera pas toutes les méthodes sauf une branche.

Cela peut aider quand Google décidera dans certaines versions futures d’Android de déconseiller la méthode fromHtml(String source, int flags).

5
jakubbialkowski

Vous pouvez utiliser 

//noinspection deprecation
return Html.fromHtml(source);

supprimer l'inspection pour une seule déclaration, mais pas pour l'ensemble de la méthode.

3
Nikolay Tsigouro

La classe de structure a été modifiée pour exiger un indicateur informant fromHtml() du traitement des sauts de ligne. Cela a été ajouté dans Nougat, et ne concerne que le défi des incompatibilités de cette classe à travers les versions d'Android.

J'ai publié une bibliothèque de compatibilité pour normaliser et rétroporter la classe et inclure davantage de rappels pour les éléments et le style:

https://github.com/Pixplicity/HtmlCompat

Bien que similaire à la classe HTML du framework, certaines modifications de signature ont été nécessaires pour permettre davantage de rappels. Voici l'exemple de la page 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);
2
Paul Lammertsma

Si vous utilisez Kotlin , j’ai réussi à utiliser une extension Kotlin:

fun TextView.htmlText(text: String){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY))
    } else {
        setText(Html.fromHtml(text))
    }
}

Alors appelez ça comme:

textView.htmlText(yourHtmlText)
2
David Jarvis

Voici ma solution. 

 if (Build.VERSION.SDK_INT >= 24) {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage(), Html.FROM_HTML_MODE_LEGACY));
    } else {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage()));

    }
0
pavel