Html.fromHtml在Android N中已弃用

Ald*_*asa 266 android deprecated android-7.0-nougat

Html.fromHtml用来查看html TextView.

Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);
Run Code Online (Sandbox Code Playgroud)

Html.fromHtml现在已经在Android N +中弃用了

我/我如何找到新的方法?

Roc*_*ney 554

您必须在Android M及更高版本上添加版本检查并使用旧方法,在Android N及更高版本上,您应该使用新方法.如果您不添加版本检查,您的应用将在较低的Android版本上中断.您可以在Util类中使用此方法.

HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
Run Code Online (Sandbox Code Playgroud)

标志参数:

@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
    if(html == null){
        // return an empty spannable if the html is null
        return new SpannableString("");
    }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
        // we are using this flag to give a consistent behaviour
        return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
    } else {
        return Html.fromHtml(html);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在Html类文档中阅读有关不同标志的更多信息

  • 啊,等待HtmlCompat之类的东西出现 (13认同)
  • 在`else`下添加`// noinspection deprecation`注释以避免lint警告也很有用. (11认同)
  • `Html.FROM_HTML_MODE_LEGACY` (4认同)
  • 零表示哪个标志? (2认同)

k2c*_*col 92

我有很多这些警告,我总是使用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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 与接受的答案相同的效果,但由于SuppressWarnings注释而+1 (2认同)

Xan*_*Xan 56

比较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
Run Code Online (Sandbox Code Playgroud)

FROM_HTML标志


And*_*ndy 29

或者您可以使用androidx.core.text.HtmlCompat:

HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
Run Code Online (Sandbox Code Playgroud)

HtmlCompat文档


Leo*_*der 24

如果你足够幸运在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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后到处使用它真是太好了:

yourTextView.text = anyString.toSpanned()
Run Code Online (Sandbox Code Playgroud)

  • 你可以通过删除`Spanned`和`return`来保存打字 (5认同)

Int*_*iya 14

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"));
        }
Run Code Online (Sandbox Code Playgroud)

对于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
    }
Run Code Online (Sandbox Code Playgroud)

呼叫

 txt_OBJ.text  = setTextHTML("IIT Amiyo")
Run Code Online (Sandbox Code Playgroud)


USK*_*ity 8

来自官方文件:

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

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

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL选项toHtml(Spanned, int):包裹由'\n'a <p><li> 元素内部分隔的每行文本.

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


Dav*_*vis 6

如果您使用的是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))
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

textView.htmlText(yourHtmlText)
Run Code Online (Sandbox Code Playgroud)


Hru*_*hay 6

对于 Kotlin 用户,我们可以使用String.parseAsHtml()使用 HtmlCompat 的扩展函数,而HtmlCompat又具有兼容性检查。

这可以从 android core kotlin 扩展中获得,可以从androidx.core:core-ktx


jak*_*ski 5

只是为了扩展@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里CompatUtils.isApiNonLowerThan:

public static boolean isApiNonLowerThan(int versionCode) {
    return Build.VERSION.SDK_INT >= versionCode;
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于没有额外的局部变量,并且弃用仅在else分支中.所以这不会压制所有方法而是单个分支.

当Google决定在Android的某些未来版本中弃用甚至该fromHtml(String source, int flags)方法时,它会有所帮助.