Відповіді:
оновлення : як зазначено нижче @Andy, компанія Google створила HtmlCompat
замість наведеного нижче методу. Додайте цю залежність implementation 'androidx.core:core:1.0.1
у файл build.gradle свого додатка. Переконайтеся, що ви використовуєте останню версію androidx.core:core
.
Це дозволяє використовувати:
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
Більше про різні прапори ви можете прочитати на HtmlCompat-документації
оригінальна відповідь:
В Android N вони запровадили новий Html.fromHtml
метод. Html.fromHtml
тепер потрібен додатковий параметр, названий прапорами. Цей прапор дає вам більше контролю над тим, як відображається ваш HTML-код.
На Android N і вище слід використовувати цей новий метод. Старіший метод застарілий і може бути видалений у майбутніх версіях Android.
Ви можете створити власний Util-метод, який використовуватиме старий метод на старих версіях та новіший метод на Android N і вище. Якщо ви не додаєте версію, перевірте, що ваш додаток не працює на нижчих версіях Android. Ви можете використовувати цей метод у своєму класі Util.
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
if(html == null){
// return an empty spannable if the html is null
return new SpannableString("");
}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
// we are using this flag to give a consistent behaviour
return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
} else {
return Html.fromHtml(html);
}
}
Ви можете перетворити HTML.FROM_HTML_MODE_LEGACY
в додатковий параметр, якщо хочете. Це дає вам більше контролю над тим, який прапор використовувати.
Ви можете прочитати більше про різні прапори в документації до класу Html
Html.FROM_HTML_MODE_LEGACY
//noinspection deprecation
коментар просто під заголовком, else
щоб уникнути попереджень про ворсинки.
У мене було багато цих попереджень, і я завжди використовую 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);
}
}
Порівняйте прапори відHtml ().
<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
Або ви можете використовувати androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
Якщо вам пощастило розвиватися в Kotlin, просто створіть функцію розширення:
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()
Spanned
таreturn
Цей метод був
застарілийу рівні 24 API .
Слід використовувати 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")
HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
Від офіційного документа:
fromHtml(String)
метод API був застарілий у рівні 24 APIfromHtml(String, int)
.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
Варіант дляtoHtml(Spanned, int)
: Обертання послідовних рядків тексту, розділених'\n'
внутрішніми<p>
елементами.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
Варіант дляtoHtml(Spanned, int)
: Оберніть кожен рядок тексту, розміщений'\n'
всередині а<p>
чи<li>
елементом.
https://developer.android.com/reference/android/text/Html.html
Якщо ви використовуєте Kotlin , я досяг цього, використовуючи розширення Kotlin:
fun TextView.htmlText(text: String){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY))
} else {
setText(Html.fromHtml(text))
}
}
Тоді називайте це так:
textView.htmlText(yourHtmlText)
Просто для розширення відповіді від @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);
придушити перевірку лише на одне твердження, але не на весь метод.
Рамковий клас було змінено, щоб вимагати прапор для інформування fromHtml()
як обробляти розриви рядків. Це було додано в Nougat і стосується лише проблеми несумісності цього класу для версій 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);
minSdkVersion 15
і targetSdkVersion 23
я отримую помилку збірки для значень-v24.xml : Очевидно,Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'.
ваша бібліотека націлена на рівень API 25. Як я ще можу ним користуватися?
просто зробіть функцію:
public Spanned fromHtml(String str){
return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
}
Спробуйте наступне, щоб підтримувати основні теги 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 [... необроблені HTML-дані ...]]>