Android N中不赞成使用Html.fromHtml
我正在使用Html.fromHtml
在TextView
查看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
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)
。
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
toHtml(Spanned, int)
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
toHtml(Spanned, int)
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
选项:在<p>
元素内包装由'\n'
分隔的连续文本行。
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:
虽然它与框架的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数据…]]>