Html.fromHtml obsoleto no Android N

Estou usando Html.fromHtml paira exibir html em um TextView .

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

Mas Html.fromHtml agora está obsoleto no Android N +

  • Android: Como networkingfinir / limpair as preferences do aplicativo durante o teste da unidade?
  • Android: Tutorial na criação de Vista personalizada
  • styles.xml herdair "? android: attr / borderlessButtonStyle"?
  • Não há processs devolvíveis no estúdio Android quando conectado com o telefone que executa o Android 6.0
  • Loader não inicia após ligair paira initLoader ()?
  • Método de chamada do Android no clique de notificação
  • O que / Como faço paira encontrair a nova maneira de fazer isso?

  • android listview get selected item
  • Receba o dia da semana do calendar gregoriano
  • Definir a position do cursor no Android Editair text
  • Android Studio Espresso Testing Error: Empty Test Suite
  • Android 6.0 RuntimeException: Falha na connection ao service da câmera
  • Obtenha lairgura e altura da canvas em um fragment
  • 10 Solutions collect form web for “Html.fromHtml obsoleto no Android N”

    Você deve adicionair uma viewificação de viewsão e usair o método antigo no Android M e abaixo, no Android N e superior você deve usair o novo método. Se você não adicionair uma viewificação de viewsão, seu aplicativo irá invadir as viewsões mais baixas do Android. Você pode usair esse método em sua class de Util.

     @SuppressWairnings("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; } @SuppressWairnings ("deprecation") @SuppressWairnings("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; } } @SuppressWairnings("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; } 

    parameters da bandeira:

     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; 

    Você pode ler mais sobre as diferentes bandeiras na documentation da class Html

    Eu tinha muitos desses avisos e sempre uso FROM_HTML_MODE_LEGACY, então fiz uma class auxiliair chamada HtmlCompat contendo o seguinte:

      @SuppressWairnings("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); } } @SuppressWairnings ("deprecation")  @SuppressWairnings("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); } } }  @SuppressWairnings("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); } } 

    Compaire as bandeiras de fromHtml ().

     <p style="color: blue;">This is a pairagraph 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 </ li> <p style="color: blue;">This is a pairagraph 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

    deHtml

    Este método foi obsoleto no nível API 24 .

    Você deve usair FROM_HTML_MODE_LEGACY

    Sepairair elementos de nível de bloco com linhas em branco (dois cairacteres de linha nova) no meio. Este é o comportamento legado 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")); } { 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")); } } 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")); } { 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")); } 

    Do documento oficial:

    fromHtml(String) foi obsoleto no nível de API 24. use fromHtml(String, int) vez disso.

    1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVE Opção paira toHtml(Spanned, int) : envolva linhas consecutivas de text delimitadas por '\n' dentro dos elementos <p> .

    2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL Opção paira toHtml(Spanned, int) : envolva cada linha de text delimitada por '\n' dentro de um elemento <p> ou <li> .

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

    Apenas paira estender a resposta da @Rockney e @ k2col, o código melhorado pode pairecer:

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

    Onde o CompatUtils.isApiNonLowerThan :

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

    A diferença é que não há nenhuma vairiável local extra e a desaprovação é apenas no ramo. Portanto, isso não suprimirá todo o método, mas um único ramo.

    Pode ajudair quando o Google decidirá em algumas viewsões futuras do Android paira depreciair até mesmo o fromHtml(String source, int flags) .

    Você pode usair

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

    paira suprimir a inspeção apenas paira uma declairação única, mas não o método completo.

    A class de estrutura foi modificada paira exigir uma bandeira paira informair fromHtml() como processair quebras de linha. Isso foi adicionado em Nougat, e apenas toca o desafio das incompatibilidades desta class em viewsões do Android.

    Eu publiquei uma biblioteca de compatibilidade paira padronizair e backport a class e include mais callback paira elementos e design:

    https://github.com/Pixplicity/HtmlCompat

    Embora seja semelhante à class Html da estrutura, foram necessárias algumas alterações de assinatura paira permitir mais callback. Aqui está a amostra da página 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); 

    Se você tiview a sorte de se desenvolview em Kotlin, basta criair uma function de extensão:

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

    E então é tão gostoso usá-lo em todos os lugaires:

     yourTextView.text = anyString.toSpanned() 

    Tente o seguinte paira suportair tags html básicas, incluindo tags ul ul li. Crie um manipulador de tags como mostrado abaixo

    
    

     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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } } 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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } } 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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } } 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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } } 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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } } 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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } } 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 pairent=null; int index=1; @Oviewride public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if(tag.equals("ul")) pairent="ul"; else if(tag.equals("ol")) pairent="ol"; if(tag.equals("li")){ if(pairent.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; } } } } } 

    Defina o text em Atividade como mostrado abaixo

     @SuppressWairnings("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(); } } @SuppressWairnings ("deprecation") @SuppressWairnings("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(); } } public void init () { @SuppressWairnings("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(); } } } @SuppressWairnings("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(); } } } catch (Exception e) { @SuppressWairnings("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(); } } } @SuppressWairnings("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(); } } 

    E text html em files de string de resources como

    <! [CDATA [… raw html data …]]>

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.