我使用html . fromhtml在TextView中查看html。

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

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

我怎样才能找到做这件事的新方法?


当前回答

如果你正在使用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)

其他回答

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

如果您有幸在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()

来自官方文件:

fromHtml(String)方法在API级别24中已弃用。使用fromHtml(String, int) 代替。 to_html_段落_lines_continuous选项toHtml(span, int):将以“\n”分隔的连续文本行换行<p> 元素。 to_html_段落_lines_individual选项toHtml(span, int):将每一行由'\n'分隔的文本包装在<p>或<li>内 元素。

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

你可以使用

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

仅对单个语句而不是整个方法抑制检查。

为了扩展@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;
}

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

它可以帮助谷歌将决定在一些未来版本的Android弃用甚至fromHtml(字符串源,int标志)方法。