Html.fromHtml obsoleta en Android N
Estoy usando Html.fromHtml
para ver html en un TextView
.
Spanned result = Html.fromHtml(mNews.getTitle()); ... ... mNewsTitle.setText(result);
Pero Html.fromHtml
ahora está obsoleto en Android N +
- Android WebView PictureListener Deprecated - ¿Todavía no hay alternativa?
- Custom PopupWindow con el método despreciado BitmapDrawable
- Mostrar clases que contienen depreciación Android Studio
- ¿Qué se debe utilizar en lugar de "setListNavigationCallbacks"?
- GetSize () no es compatible con versiones anteriores de Android OS, getWidth () / getHeight () obsoleto
¿Qué / Cómo encuentro la nueva forma de hacer esto?
- SlidingDrawer obsoleta
- Crashlytics deprecating logException () ¿cuál es el reemplazo?
- GetResources (). GetColor () está obsoleto
- ¿Cómo debo usar / no usar métodos obsoletos en Android
- Android: vista de la cámara: la aplicación se bloquea cuando no utilizo un método obsoleto
Tienes que añadir una versión de verificación y utilizar el método antiguo en Android M y por debajo, en Android N y superior debe utilizar el nuevo método. Si no agrega un control de versión, la aplicación se romperá en las versiones inferiores de Android. Puede utilizar este método en su clase Util.
@SuppressWarnings("deprecation") public static Spanned fromHtml(String html){ Spanned result; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY); } else { result = Html.fromHtml(html); } return result; }
Parámetros de la bandera:
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;
Puede leer más acerca de los diferentes indicadores en la documentación de la clase Html
Tuve muchas de estas advertencias y siempre uso FROM_HTML_MODE_LEGACY por lo que hice una clase de ayuda llamada HtmlCompat que contiene lo siguiente:
@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); } }
Comparación de las banderas 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
DeHtml
Este método fue
obsoletoen API nivel 24 .
Debe utilizar FROM_HTML_MODE_LEGACY
Separar los elementos de nivel de bloque con líneas en blanco (dos caracteres de nueva línea) en el medio. Este es el comportamiento anterior a N.
Código
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")); }
De documento oficial:
fromHtml(String)
método fue obsoleto en el nivel de la API 24. usefromHtml(String, int)
lugar.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
Opción paratoHtml(Spanned, int)
: Envuelva líneas consecutivas de texto delimitadas por elementos'\n'
dentro de<p>
.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
Opción paratoHtml(Spanned, int)
: Envuelva cada línea de texto delimitada por'\n'
dentro de un elemento<p>
o un elemento<li>
.
https://developer.android.com/reference/android/text/Html.html
Sólo para ampliar la respuesta de @Rockney y @ k2col el código mejorado puede verse así:
@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); } }
Donde el CompatUtils.isApiNonLowerThan
:
public static boolean isApiNonLowerThan(int versionCode) { return Build.VERSION.SDK_INT >= versionCode; }
La diferencia es que no hay ninguna variable local adicional y la depreciación es sólo en la rama else
. Así que esto no suprimirá todo el método excepto una sola rama.
Puede ayudar cuando el Google decida en algunas versiones futuras de Android a depreciar incluso el fromHtml(String source, int flags)
.
Puedes usar
//noinspection deprecation return Html.fromHtml(source);
Para suprimir la inspección sólo por declaración única, pero no todo el método.
La clase marco se ha modificado para requerir un indicador para informar fromHtml()
cómo procesar los saltos de línea. Esto fue agregado en Nougat, y sólo toca el desafío de incompatibilidades de esta clase entre las versiones de Android.
He publicado una biblioteca de compatibilidad para estandarizar y backport de la clase e incluir más devoluciones de llamada para los elementos y el estilo:
Aunque es similar a la clase Html del marco, se requerían algunos cambios de firma para permitir más devoluciones de llamada. Aquí está el ejemplo de la página de 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);
Pruebe lo siguiente para admitir etiquetas HTML básicas, incluidas las etiquetas ul ol li. Cree un controlador de etiquetas como se muestra a continuación
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; } } } } }
Establezca el texto en Actividad como se muestra a continuación
@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(); } }
Y texto html en archivos de cadena de recursos como
<! [CDATA [… datos html sin procesar …]]>