Android N中不赞成使用Html.fromHtml

我正在使用Html.fromHtmlTextView查看HTML。

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

但是Html.fromHtml现在在Android N +中被弃用了

什么/如何find这样做的新方法?

您必须添加版本检查并在Android M及以下版本中使用旧方法,在Android N及更高版本中,您应该使用新方法。 如果您不添加版本检查您的应用程序将打破较低的Android版本。 你可以在你的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; } 

标志参数:

 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; 

您可以阅读更多关于Html类文档上的不同标志

我有很多这些警告,我总是使用FROM_HTML_MODE_LEGACY,所以我做了一个名为HtmlCompat的助手类包含以下内容:

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

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标志

fromHtml

此方法在API级别24中 弃用

您应该使用FROM_HTML_MODE_LEGACY

用空白行(两个换行符)分隔块级元素。 这是N之前的传统行为。

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

从官方文档:

fromHtml(String)方法在API级别24中已弃用。请改用fromHtml(String, int)

  1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVE toHtml(Spanned, int) TO_HTML_PARAGRAPH_LINES_CONSECUTIVE toHtml(Spanned, int) TO_HTML_PARAGRAPH_LINES_CONSECUTIVE选项:在<p>元素内包装由'\n'分隔的连续文本行。

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL选项toHtml(Spanned, int) TO_HTML_PARAGRAPH_LINES_INDIVIDUAL toHtml(Spanned, int) :将由'\n'分隔的每行文本包装在<p><li>元素中。

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

只是为了扩展@Rockney和@ k2col的答案,改进后的代码可能如下所示:

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

那里的CompatUtils.isApiNonLowerThan

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

不同的是,没有额外的局部variables,弃用只在else分支。 所以这不会抑制所有方法,而是单个分支。

它可以帮助谷歌将决定在未来的Android版本,即使从fromHtml(String source, int flags)方法。

如果您有幸在Kotlin上开发,只需创build一个扩展function:

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

然后在任何地方都很好用

 yourTextView.text = anyString.toSpanned() 

您可以使用

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

只为单一声明而不是整个方法压制检查。

框架类已被修改为需要一个标志来通知fromHtml()如何处理换行符。 这是在Nougat中添加的,只是触及Android版本中这个类不兼容的挑战。

我已经发布了一个兼容库来标准化和回溯类,包括更多元素和样式的callback:

https://github.com/Pixplicity/HtmlCompat

虽然它与框架的Html类相似,但需要一些签名更改以允许更多的callback。 以下是来自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); 

尝试以下操作来支持基本的html标签,包括ul ol li标签。 创build一个标签处理程序,如下所示



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

在Activity上设置文本,如下所示

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

和资源string文件中的html文本一样

<![CDATA […原始html数据…]]>