wake-up-neo.com

Html.fromHtml in Android N veraltet

Ich verwende Html.fromHtml, um HTML in einer TextView anzuzeigen.

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

Aber Html.fromHtml ist jetzt in Android N + veraltet

Was/Wie finde ich den neuen Weg, dies zu tun?

220
Aldasa

Sie müssen eine Versionsprüfung hinzufügen und die alte Methode unter Android M und darunter verwenden, unter Android N und höher sollten Sie die neue Methode verwenden. Wenn Sie keine Versionsprüfung hinzufügen, wird Ihre App bei niedrigeren Android-Versionen fehlerhaft. Sie können diese Methode in Ihrer Util-Klasse verwenden.

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

Kennzeichnungsparameter:

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;

Weitere Informationen zu den verschiedenen Flags finden Sie in der Html-Klassendokumentation

474
Rockney

Ich hatte viele dieser Warnungen und verwende immer FROM_HTML_MODE_LEGACY. Deshalb habe ich eine Helfer-Klasse namens HtmlCompat erstellt, die Folgendes enthält:

   @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

Vergleich der Flags von 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

Wenn Sie das Glück haben, auf Kotlin zu entwickeln, erstellen Sie einfach eine Erweiterungsfunktion.

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

Und dann ist es so süß, es überall einzusetzen: 

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

Oder Sie können androidx.core.text.HtmlCompat verwenden:

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

HtmlCompat-Dokumente

14
Andy

fromHtml

Diese Methode war veraltet in API-Ebene 24.

Sie sollten FROM_HTML_MODE_LEGACY verwenden.

Trennen Sie Elemente auf Blockebene durch Leerzeilen (zwei Zeilenumbrüche ) Dazwischen. Dies ist das alte Verhalten vor 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"));
        }

Für 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
    }

Anruf

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

Vom offiziellen Dokument:

Die Methode fromHtml(String) wurde in API-Ebene 24 nicht mehr unterstützt. use fromHtml(String, int) stattdessen.

  1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVE Option für toHtml(Spanned, int): Umbricht fortlaufende Textzeilen, die durch '\n' in <p>____ begrenzt sind. Elemente.

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL Option für toHtml(Spanned, int): Jede Textzeile, die durch '\n' begrenzt ist, in einen <p> oder einen <li>.__ umschließen Element.

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

7
USKMobility

Um die Antwort von @Rockney und @ k2col zu erweitern, kann der verbesserte Code folgendermaßen aussehen:

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

Wo der CompatUtils.isApiNonLowerThan:

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

Der Unterschied besteht darin, dass es keine zusätzliche lokale Variable gibt und die Ablehnung nur im Zweig else erfolgt. Dies unterdrückt also nicht alle Methoden, sondern nur einen Zweig.

Es kann hilfreich sein, wenn Google in einigen zukünftigen Android-Versionen entscheidet, auch die fromHtml(String source, int flags)-Methode abzulehnen.

5
jakubbialkowski

Sie können verwenden 

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

Überprüfung nur für eine einzelne Anweisung, aber nicht für die gesamte Methode.

3

Die Framework-Klasse wurde so geändert, dass ein Flag erforderlich ist, um fromHtml() darüber zu informieren, wie Zeilenumbrüche verarbeitet werden. Dies wurde in Nougat hinzugefügt und betrifft nur die Herausforderung der Inkompatibilitäten dieser Klasse in verschiedenen Android-Versionen.

Ich habe eine Kompatibilitätsbibliothek veröffentlicht, um die Klasse zu standardisieren und zurück zu portieren und um weitere Rückrufe für Elemente und Stil zu ermöglichen:

https://github.com/Pixplicity/HtmlCompat

Obwohl es der Html-Klasse des Frameworks ähnelt, waren einige Signaturänderungen erforderlich, um weitere Rückrufe zuzulassen. Hier ist das Beispiel von der GitHub-Seite:

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

Wenn Sie Kotlin verwenden, habe ich dies mit einer Kotlin-Erweiterung erreicht:

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

Dann nennen Sie es wie:

textView.htmlText(yourHtmlText)
2
David Jarvis

Hier ist meine Lösung. 

 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