Html.fromHtml устарел в Android N

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

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

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

Что / Как найти новый способ сделать это?

Вы должны добавить проверку версии и использовать старый метод на Android M и ниже, на Android N и выше вы должны использовать новый метод. Если вы не добавите проверку версии, ваше приложение сломается на более низких версиях Android. Вы можете использовать этот метод в своем classе 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; 

Вы можете больше узнать о разных флагах в документации по classу Html

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

 

This is a paragraph with a style

Heading H4

  • li orange element
  • li #2 element
This is a blockquote
Text after blockquote Text before div
This is a div
Text after div

Флаги FROM_HTML

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

 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

Отдельные элементы уровня блока с пустыми строками (два символа новой строки) между ними. Это унаследованное поведение до 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")); } 

Для Котлина

 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) используйте fromHtml(String, int) .

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

    .

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL Опция toHtml(Spanned, int) : оберните каждую строку текста, ограниченную '\n' внутри элемента

    или

  3. .

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) даже метод fromHtml(String source, int flags) .

Вы можете использовать

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

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

Класс framework был изменен, чтобы потребовать, чтобы флаг информировал fromHtml() том, как обрабатывать разрывы строк. Это было добавлено в Nougat и затрагивает только проблему несовместимости этого classа в версиях Android.

Я опубликовал библиотеку совместимости для стандартизации и резервного копирования classа и включения большего числа обратных вызовов для элементов и стилей:

https://github.com/Pixplicity/HtmlCompat

Несмотря на то, что он похож на class 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

Попробуйте следующее для поддержки основных тегов html, включая tags 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 текст на строковых файлах ресурсов как

  • Как сохранить данные в приложении Android
  • Как «перезапустить» приложение для Android в программном отношении
  • Службы Google Play Game - невозможно войти в систему
  • как создать круговой просмотрщик?
  • Хотите загрузить настольную версию в мой веб-просмотр с помощью uastring
  • Открыть конкретную активность, когда уведомление было нажато в FCM
  • Ввод плотности экрана в правильное ведро
  • onKeyListener не работает с мягкой клавиатурой (Android)
  • Android: получите информацию о программном обеспечении
  • Как вернуть значение dataSnapshot в результате метода?
  • Как удалить приложение из недавнего списка
  • Давайте будем гением компьютера.