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?
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);
}
}
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
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);
}
}
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
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()
Ou vous pouvez utiliser androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
Cette méthode était
obsolètedans 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")
Du doc officiel:
La méthode
fromHtml(String)
était obsolète dans l'API de niveau 24. UtilisezfromHtml(String, int)
au lieu.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
Option pourtoHtml(Spanned, int)
: retourne des lignes de texte consécutives délimitées par'\n'
dans<p>
éléments.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
Option pourtoHtml(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
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)
.
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.
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:
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);
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)
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()));
}