HTML.fromHtml déprécié Dans Android N

j'utilise Html.fromHtml pour visualiser html dans un TextView .

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

mais Html.fromHtml est maintenant déprécié Dans Android n+

Comment trouver la nouvelle façon de faire ceci?

207
demandé sur Hi I'm Frogatto 2016-06-19 10:00:12

11 réponses

Vous devez ajouter un contrôle de version, et utiliser l'ancienne méthode sur Android M et au-dessous, sur Android N et plus vous devez utiliser la nouvelle méthode. Si vous n'ajoutez pas de version, vérifiez que votre application se brisera sur les versions inférieures D'Android. Vous pouvez utiliser cette méthode dans votre Util classe.

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

Drapeau paramètres:

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 indicateurs sur la Html de documentation de classe

444
répondu Rockney 2018-03-02 03:40:23

j'ai eu beaucoup de ces avertissements et j'utilise toujours FROM_HTML_MODE_LEGACY donc j'ai fait 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);
        }
    }
81
répondu k2col 2016-10-03 22:02:24

Compare des 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

44
répondu Xan 2017-03-22 16:18:02

si vous avez la chance de vous développer sur Kotlin, il suffit de créer 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 il est si doux de l'utiliser partout:

yourTextView.text = anyString.toSpanned()
13
répondu Leo Droidcoder 2017-08-30 14:48:37

fromHtml

Cette méthode a été obsolète dans API de niveau 24 .

vous devez utiliser DE_HTML_MODE_LEGACY

éléments séparés au niveau du bloc avec des lignes vierges (deux de retour à la ligne caractères) entre les deux. C'est le comportement de l'héritage 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
    }

Appel

 txt_OBJ.text  = setTextHTML("IIT Amiyo")
10
répondu IntelliJ Amiya 2018-02-23 12:52:52

du doc officiel:

La méthode

fromHtml(String) a été dépréciée au niveau 24 de L'API. use fromHtml(String, int) plutôt.

  1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVE Option pour toHtml(Spanned, int) : envelopper les lignes de texte consécutives délimitées par '\n' à l'intérieur de <p> élément.

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

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

7
répondu USKMobility 2016-06-19 08:02:19

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

@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'y a pas de variable locale supplémentaire et la dépréciation est seulement dans la branche else . Donc cela ne supprimera pas toute la méthode mais une seule branche.

il peut aider quand Google décidera dans certaines versions futures D'Android pour déprécier même le fromHtml(String source, int flags) la méthode.

5
répondu jakubbialkowski 2017-02-16 10:42:58

vous pouvez utiliser

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

pour supprimer l'inspection seulement pour une seule déclaration, mais pas la méthode entière.

3
répondu Nikolay Tsigouro 2016-12-30 08:38:39

la classe framework a été modifiée pour exiger un indicateur pour informer fromHtml() de la façon de traiter les sauts de ligne. Cela a été ajouté à Nougat, et ne touche au 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 plus de callbacks pour les éléments et le style:

https://github.com/Pixplicity/HtmlCompat

bien qu'il soit similaire à la classe Html du framework, certains changements de signature ont été nécessaires pour permettre plus de callbacks. Voici l'échantillon 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
répondu Paul Lammertsma 2017-03-15 14:02:43

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

HtmlCompat.fromHtml(textWithHtmlTags, HtmlCompat.FROM_HTML_MODE_LEGACY)

HtmlCompat docs

1
répondu Andy 2018-09-01 18:02:53

essayez ce qui suit pour prendre en charge les balises html de base, y compris les balises ul ol li. Créer un gestionnaire D'étiquettes comme indiqué ci-dessous



import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.Html.TagHandler;
import android.util.Log;

public class MyTagHandler implements TagHandler {
    boolean first= true;
    String parent=null;
    int index=1;
    @Override
    public void handleTag(boolean opening, String tag, Editable output,
                          XMLReader xmlReader) {

        if(tag.equals("ul")) parent="ul";
        else if(tag.equals("ol")) parent="ol";
        if(tag.equals("li")){
            if(parent.equals("ul")){
                if(first){
                    output.append("\n\t•");
                    first= false;
                }else{
                    first = true;
                }
            }
            else{
                if(first){
                    output.append("\n\t"+index+". ");
                    first= false;
                    index++;
                }else{
                    first = true;
                }
            }
        }
    }
}

Réglez le texte sur L'activité comme suit:



    @SuppressWarnings("deprecation")
        public void init(){
            try {
                TextView help = (TextView) findViewById(R.id.help);
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                    help.setText(Html.fromHtml(getString(R.string.help_html),Html.FROM_HTML_MODE_LEGACY, null, new MyTagHandler()));
                } else {
                    help.setText(Html.fromHtml(getString(R.string.help_html), null, new MyTagHandler()));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

 

et le texte html sur les fichiers de chaîne de ressources comme

-1
répondu Bruce 2017-07-14 17:07:06