Формат html.fromHtml устарел в Android N
Я использую Html.fromHtml
для просмотра html в TextView
.
Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);
но Html.fromHtml
теперь устарел в Android N+
что / как я могу найти новый способ сделать это?
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
Если Вам ПОВЕЗЕТ развиваться на Котлине, просто создайте функцию расширения:
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()
этот метод был
устаревшийна уровень 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)
вместо.
на
toHtml(Spanned, int)
: обертывание последовательных строк текста, разделенных'\n'
внутри<p>
элементы.на
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.я опубликовал библиотеку совместимости для стандартизации и обратного переноса класса и включить больше обратных вызовов для элементов и стилей:
хотя он похож на 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)
попробуйте выполнить следующие действия для поддержки основных тегов 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-текст в строковых файлах ресурсов как