Android N中已弃用Html.fromHtml函数

403

我正在使用Html.fromHtml将HTML呈现在TextView中。

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

但是在Android N+中,Html.fromHtml已经被弃用。

我应该如何找到新的实现方式?

15个回答

4
你可以使用

标签来


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

只在单个语句中禁止检查,而不是整个方法。


3
这是我的解决方案。
 if (Build.VERSION.SDK_INT >= 24) {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage(), Html.FROM_HTML_MODE_LEGACY));
    } else {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage()));

    }

3
只需创建一个函数:
public Spanned fromHtml(String str){
  return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
}

为什么不使用FROM_HTML_MODE_COMPACT - user924

2
框架类已被修改,需要一个标志来通知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);

当我在使用minSdkVersion 15targetSdkVersion 23的应用程序中使用您的库时,我会在_values-v24.xml_上遇到编译错误: Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'. 您的库针对API级别25进行了定位。那么,我该如何继续使用它呢? - JJD

-1

尝试以下方法来支持基本的HTML标签,包括ul ol li标签。 创建如下所示的标签处理程序

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();
        }

    }

在资源字符串文件中,将HTML文本作为

<![CDATA[ ...原始HTML数据...]] >


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接