android html.fromhtml 过期,Html.fromHtml在Android N中已弃用

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

This is a div

Text after div

3435d828e68d9eaefa3ed92570a3660e.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值