Intereting Posts
Как вернуть данные из php в eclipse? Какова максимальная длина имени приложения для Android? Как передать значения между действиями на Android? Компиляция FFmpeg 2.3 с Android NDK r10 Проверьте, отображается ли мягкая клавиатура с помощью эспрессо Android Packager: java.util.zip.ZipException: двойная запись: classes.dex Изменение размера текста кнопки диалогового окна Android с помощью стилей Android Facebook SDK: проверьте, зарегистрирован ли пользователь или нет. Android: onDestroy () или аналогичный метод в классе приложения IOException: сбой чтения, сокет может быть закрыт – Bluetooth на Android 4.3 Скрытие AppBarLayout и предоставление его места остальному виду Как анимировать кнопку плавающего действия, используя переход к активности Android? Как отправить данные POST с кодом в веб-обозревателе Android Как включить CardView в ViewPager Как предотвратить изменение пользовательских представлений из-за изменений ориентации экрана

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

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

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

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

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

Solutions Collecting From Web of "Html.fromHtml устарел в Android N"

Вы должны добавить проверку версии и использовать старый метод на Android M и ниже, на Android N и выше вы должны использовать новый метод. Если вы не добавите проверку версии, ваше приложение переломится на более низкие версии Android. Вы можете использовать этот метод в своем классе Util.

 @SuppressWarnings("deprecation") public static Spanned fromHtml(String html){ Spanned result; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY); } else { result = Html.fromHtml(html); } return result; } 

Параметры флага:

 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

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

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

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

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

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL Опция 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) даже метод fromHtml(String source, int flags) .

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

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

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

Класс framework был изменен, чтобы потребовать, чтобы флаг информировал 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); 

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

<! [CDATA [… raw html data …]]>