Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android N中不推荐使用Html.fromHtml_Android_Deprecated_Android 7.0 Nougat - Fatal编程技术网

Android N中不推荐使用Html.fromHtml

Android N中不推荐使用Html.fromHtml,android,deprecated,android-7.0-nougat,Android,Deprecated,Android 7.0 Nougat,我正在使用Html.fromHtml在TextView中查看Html Spanned result = Html.fromHtml(mNews.getTitle()); ... ... mNewsTitle.setText(result); 但是,Html.fromHtml现在在Android N中被弃用+ 我如何找到这种新的方法?来自官方文件: fromHtml(String)方法在API级别24中被弃用。使用fromHtml(字符串,int) 相反 TO\u HTML\u段落\u行用于to

我正在使用
Html.fromHtml
TextView
中查看Html

Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);
但是,
Html.fromHtml
现在在Android N中被弃用+

我如何找到这种新的方法?

来自官方文件:

fromHtml(String)
方法在API级别24中被弃用。使用
fromHtml(字符串,int)
相反

  • TO\u HTML\u段落\u行
    用于
    toHtml(span,int)
    的连续选项:在
    
    元素

  • 到HTML\u段落行\u单个
    选项
    到HTML(span,int)
    :将由
    '\n'
    分隔的每行文本包装在
  • 
    元素

  • 更新: 因为谷歌已经创建了
    HtmlCompat
    ,可以用它来代替下面的方法。添加此依赖项
    实现'androidx.core:core:1.0.1
    转到应用程序的build.gradle文件。确保使用最新版本的androidx.core:core

    这允许您使用:

    HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
    
    您可以阅读更多关于屏幕上不同标志的信息

    原始答案: 在安卓N中,他们引入了一种新的
    Html.fromHtml
    方法
    Html.fromHtml
    现在需要一个名为flags的附加参数。此标志使您能够更好地控制HTML的显示方式

    在安卓N和更高版本上,您应该使用这种新方法。旧方法已被弃用,可能会在未来的Android版本中删除

    您可以创建自己的Util方法,该方法将在旧版本上使用旧方法,在Android N及更高版本上使用新方法。如果您不添加版本检查,您的应用程序将在较低的Android版本上中断。您可以在Util类中使用此方法

    @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);
        }
    }
    
    如果需要,可以将
    HTML.FROM_HTML_MODE_LEGACY
    转换为附加参数。这使您可以更多地控制使用哪个标志

    您可以阅读更多关于屏幕上不同标志的信息

    我有很多这样的警告,我总是使用FROM\u HTML\u MODE\u 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);
            }
        }
    

    比较fromHtml()的标志

    这是一个带有样式的段落

    品目H4
    • 锂橙元素
    • li#2元素
    这是一个区块报价 块引号后的文本 div之前的文本 这是一个div div后面的文本

    该方法在API 24级中被弃用

    您应该使用

    使用空行(两个换行符)分隔块级元素 字符)介于两者之间。这是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
        }
    
    召唤

    你可以用

    //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);
        }
    }
    
    其中
    compatitils.isApiNonLowerThan

    public static boolean isApiNonLowerThan(int versionCode) {
        return Build.VERSION.SDK_INT >= versionCode;
    }
    
    不同之处在于,没有额外的局部变量,并且只在
    else
    分支中进行了弃用。因此,这不会抑制所有方法,而是抑制单个分支


    当谷歌决定在未来的Android版本中甚至废除
    fromHtml(字符串源代码,int标志)
    方法时,它会有所帮助。

    框架类已经修改,需要一个标志来通知
    fromHtml()
    如何处理换行符。这是在牛轧糖中添加的,只涉及到这个类在Android版本之间不兼容的挑战

    我已经发布了一个兼容性库来标准化和向后移植类,并包括更多元素和样式的回调:

    虽然它类似于框架的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);
    

    尝试以下操作以支持基本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;
                    }
                }
            }
        }
    }
    
    @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();
            }
    
        }
    
    按如下所示设置“活动”上的文本

    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;
                    }
                }
            }
        }
    }
    
    @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文本


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

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

    HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
    
    HtmlCompat.fromHtml(“HTML”,HtmlCompat.FROM\u HTML\u MODE\u LEGACY)
    

    如果您使用的是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)
    

    这是我的解决办法

     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()));
    
        }
    
    只需制作一个函数:

    public Spanned fromHtml(String str){
      return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
    }
    

    零代表哪个标志?
    Html。从\u Html\u MODE\u LEGACY
    ah,等待HtmlCompat之类的东西出现也很有用,可以在
    else
    下添加
    //noinspection deprecation
    注释,以避免出现lint警告。你可以在这篇博文中看到这些标志的作用:与接受的答案效果相同,但是+1因为SuppressWarnings注释,您能对此模式给出一个小的解释吗?您能提供所有HtmlCompact可能都在git hub上吗cool@shareef我会的,但这真的只是一个无聊的实用类,里面只有一个方法……你能不能也分享一下输入HTML?这将有助于更好地理解转换。我看到样式属性没有实现,有没有实现它们的方法?能否对此模式给出一些解释?如果希望SDK处理版本检查,请使用:
    HtmlCompat.fromHtml(“textWithHtmlTags”),HtmlCompat.FROM_HTML_MODE_LEGACY)
    当我在使用
    minSdkVersion 15
    targetSdkVersion 23
    的应用程序上使用你的库时,我得到values-v24.xml的生成错误:
    错误:(3)