Формат html.fromHtml устарел в Android N


Я использую Html.fromHtml для просмотра html в TextView.

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

но Html.fromHtml теперь устарел в Android N+

что / как я могу найти новый способ сделать это?

11 207

11 ответов:

вы должны добавить проверку версии и использовать старый метод на 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

У меня было много этих предупреждений, и я всегда использую 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);
        }
    }

сравнение флагов 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

FROM_HTML FLAGS

Если Вам ПОВЕЗЕТ развиваться на Котлине, просто создайте функцию расширения:

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

этот метод был устаревший на уровень API 24.

вы должны использовать FROM_HTML_MODE_LEGACY

отдельные элементы уровня блока с пустыми строками (две новые строки символы) между ними. Это унаследованное поведение до Н.

код

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

Для Котлин

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")

из официального документа :

fromHtml(String) метод был устаревшим на уровне API 24. используйте fromHtml(String, int) вместо.

  1. на toHtml(Spanned, int): обертывание последовательных строк текста, разделенных '\n' внутри <p> элементы.

  2. на toHtml(Spanned, int): оберните каждую строку текста, разделенную '\n' внутри <p> или <li> элемент.

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

просто чтобы расширить ответ от @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 филиала. Таким образом, это не будет подавлять все методы, но одну ветвь.

Это может помочь, когда Google решит в некоторых будущих версиях Android, чтобы уступить даже fromHtml(String source, int flags) метод.

можно использовать

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

чтобы подавить проверку только для одного оператора, но не для всего метода.

класс framework был изменен, чтобы требовать флаг для информирования fromHtml() Как обрабатывать переносы строк. Это было добавлено в Нуге, и только затрагивает проблему несовместимости этого класса в разных версиях 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);

или вы можете использовать androidx.core.text.HtmlCompat:

HtmlCompat.fromHtml(textWithHtmlTags, HtmlCompat.FROM_HTML_MODE_LEGACY)

HtmlCompat docs

попробуйте выполнить следующие действия для поддержки основных тегов 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();
            }

        }

 

и html-текст в строковых файлах ресурсов как