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?
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
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);
}
}
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
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()
Cette méthode a été
obsolètedans 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")
du doc officiel:
La méthode
fromHtml(String)
a été dépréciée au niveau 24 de L'API. usefromHtml(String, int)
plutôt.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
Option pourtoHtml(Spanned, int)
: envelopper les lignes de texte consécutives délimitées par'\n'
à l'intérieur de<p>
élément.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
Option pourtoHtml(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
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.
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.
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:
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);
ou vous pouvez utiliser androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml(textWithHtmlTags, HtmlCompat.FROM_HTML_MODE_LEGACY)
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