Html.fromHtml在Android N中已弃用
我使用Html.fromHtml在TextView中查看html。
Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);
但是Html.fromHtml现已在Android N +中弃用
我/我如何找到新的方法?
12个解决方案
454 votes
您必须在Android M及更高版本上添加版本检查并使用旧方法,在Android N及更高版本上,您应该使用新方法。 如果您不添加版本检查,您的应用将在较低的Android版本上中断。 您可以在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;
您可以阅读有关不同标志的更多信息Html类文档
Rockney answered 2019-03-07T22:28:34Z
86 votes
我有很多这些警告,我总是使用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);
}
}
k2col answered 2019-03-07T22:28:58Z
45 votes
比较fromHtml()的标志。
This is a paragraph with a style
Heading H4
li orange element
- li #2 element
This is a blockquote
Text after blockquote
Text before div
Text after div
Xan answered 2019-03-07T22:29:22Z
16 votes
如果你有幸在Kotlin上开发,只需创建一个扩展功能:
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()
Leo Droidcoder answered 2019-03-07T22:29:52Z
10 votes
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"));
}
对于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
}
呼叫
txt_OBJ.text = setTextHTML("IIT Amiyo")
IntelliJ Amiya answered 2019-03-07T22:30:45Z
7 votes
来自官方文件:
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL方法在API级别24中已弃用。使用toHtml(Spanned, int) 代替。
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL选项toHtml(Spanned, int):在
中包装由'\n'分隔的连续文本行 元素。
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL选项toHtml(Spanned, int):在
或
内包装由'\n'分隔的每一行文本 元件。[https://developer.android.com/reference/android/text/Html.html]
USKMobility answered 2019-03-07T22:31:36Z
7 votes
或者你可以使用androidx.core.text.HtmlCompat:
HtmlCompat.fromHtml(textWithHtmlTags, HtmlCompat.FROM_HTML_MODE_LEGACY)
HtmlCompat文档
Andy answered 2019-03-07T22:32:07Z
5 votes
只是为了扩展@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);
}
}
fromHtml(String source, int flags):
public static boolean isApiNonLowerThan(int versionCode) {
return Build.VERSION.SDK_INT >= versionCode;
}
不同之处在于没有额外的局部变量,并且弃用仅在fromHtml(String source, int flags)分支中。 所以这不会压制所有方法而是单个分支。
当谷歌将在某些未来版本的Android中决定弃用甚至fromHtml(String source, int flags)方法时,它会有所帮助。
jakubbialkowski answered 2019-03-07T22:32:52Z
3 votes
您可以使用
//noinspection deprecation
return Html.fromHtml(source);
仅针对单个语句而不是整个方法来抑制检查。
Nikolay Tsigouro answered 2019-03-07T22:33:21Z
2 votes
框架类已被修改为需要一个标志来通知fromHtml()如何处理换行符。 这是在Nougat中添加的,只触及Android版本中此类不兼容的挑战。
我发布了一个兼容库来标准化和反向移植类,并包含更多元素和样式的回调:
[https://github.com/Pixplicity/HtmlCompat]
虽然它类似于框架的Html类,但是需要进行一些签名更改才能允许更多的回调。 以下是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);
Paul Lammertsma answered 2019-03-07T22:34:10Z
1 votes
如果您正在使用Kotlin,我通过使用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))
}
}
然后称之为:
textView.htmlText(yourHtmlText)
David Jarvis answered 2019-03-07T22:34:37Z
-1 votes
请尝试以下操作以支持基本的html标记,包括ul ol li标记。创建一个Tag处理程序,如下所示
在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();
}
}
和资源字符串文件上的html文本一样
<![CDATA [...原始html数据...]]>
Bruce answered 2019-03-07T22:35:29Z