Html.fromHtml устарел в Android N
Я использую Html.fromHtml
для просмотра html в TextView
.
Spanned result = Html.fromHtml(mNews.getTitle()); ... ... mNewsTitle.setText(result);
Но Html.fromHtml
теперь устарел в Android N +
Что / Как найти новый способ сделать это?
- Настройка глобальных стилей для Views в Android
- Android: пользовательский заголовок HTTP-запроса Volley
- Эмулятор Android Studio не поставляется с Play Store для API 23
- getApplication () и getApplicationContext ()
- как установить fragment карты google внутри прокрутки
- Android Drag / Animation of Views
- Как я могу получить список смонтированного внешнего хранилища Android-устройства
- Невозможно разрешить зависимость для: app @ debug / compileClasspath: не удалось разрешить com.android.support:appcompat-v7:26.1.0
- Как рассчитать расстояние между двумя точками, используя их долготу и значение широты
- Почему у RecyclerView нет onItemClickListener ()?
- Доступ к мультимедийному streamу Android для аудиовизуализации
- Как программно установить maxLength в Android TextView?
- В чем разница между src и фоном ImageView
Вы должны добавить проверку версии и использовать старый метод на 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
Если вам посчастливилось развиваться на Котлине, просто создайте функцию расширения:
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)
.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
Опция дляtoHtml(Spanned, int)
: Оберните последовательные строки текста, разделенные элементами'\n'
внутри.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
ОпцияtoHtml(Spanned, int)
: оберните каждую строку текста, ограниченную'\n'
внутри элементаили
.
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а и включения большего числа обратных вызовов для элементов и стилей:
Несмотря на то, что он похож на 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 текст на строковых файлах ресурсов как