Odpowiedzi:
aktualizacja : jak wspomniano poniżej @Andy , stworzył Google, HtmlCompat
którego można użyć zamiast poniższej metody. Dodaj tę zależność implementation 'androidx.core:core:1.0.1
do pliku build.gradle swojej aplikacji. Upewnij się, że używasz najnowszej wersjiandroidx.core:core
.
Pozwala to na użycie:
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
Możesz przeczytać więcej o różnych flagach w dokumentacji HtmlCompat
oryginalna odpowiedź: w
Androidzie N wprowadzono nową Html.fromHtml
metodę. Html.fromHtml
wymaga teraz dodatkowego parametru o nazwie flagi. Ta flaga zapewnia większą kontrolę nad sposobem wyświetlania kodu HTML.
W systemie Android N i nowszym powinieneś użyć tej nowej metody. Starsza metoda jest przestarzała i może zostać usunięta w przyszłych wersjach Androida.
Możesz utworzyć własną metodę Util, która będzie używać starej metody w starszych wersjach i nowszej metody w systemie Android N i nowszych. Jeśli nie dodasz wersji, sprawdź, czy aplikacja działa na niższych wersjach Androida. Możesz użyć tej metody w swojej klasie 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);
}
}
Jeśli chcesz, możesz przekonwertować parametr HTML.FROM_HTML_MODE_LEGACY
na dodatkowy. Daje to większą kontrolę nad tym, której flagi użyć.
Możesz przeczytać więcej o różnych flagach w dokumentacji klasy HTML
Html.FROM_HTML_MODE_LEGACY
//noinspection deprecation
komentarza tuż pod else
ostrzeżeniem, aby uniknąć ostrzeżeń.
Miałem wiele takich ostrzeżeń i zawsze używam FROM_HTML_MODE_LEGACY, więc stworzyłem klasę pomocniczą o nazwie HtmlCompat zawierającą:
@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);
}
}
Porównaj flagi 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
Lub możesz użyć androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
Jeśli masz szczęście rozwijać się w Kotlin, po prostu utwórz funkcję rozszerzenia:
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)
}
}
A potem tak słodko jest używać go wszędzie:
yourTextView.text = anyString.toSpanned()
Spanned
ireturn
Ta metoda została
uznana za przestarzałąna poziomie interfejsu API 24 .
Powinieneś użyć FROM_HTML_MODE_LEGACY
Oddziel elementy na poziomie bloku pustymi liniami (dwa znaki nowej linii) pomiędzy nimi. Jest to starsze zachowanie przed N.
Kod
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"));
}
Dla Kotlina
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
}
Połączenie
txt_OBJ.text = setTextHTML("IIT Amiyo")
HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
Z oficjalnego dokumentu:
fromHtml(String)
metoda została wycofana z interfejsu API na poziomie 24. użyjfromHtml(String, int)
zamiast tego.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
OpcjatoHtml(Spanned, int)
: Zawijaj kolejne wiersze tekstu ograniczonego przez elementy'\n'
wewnętrzne<p>
.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
OpcjatoHtml(Spanned, int)
: Zawijaj każdą linię tekstu ograniczonego'\n'
wewnątrz elementu<p>
lub<li>
elementu.
https://developer.android.com/reference/android/text/Html.html
Jeśli używasz Kotlin , osiągnąłem to, używając rozszerzenia 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))
}
}
Następnie nazwij to tak:
textView.htmlText(yourHtmlText)
Aby rozszerzyć odpowiedź z @Rockney i @ k2col, ulepszony kod może wyglądać następująco:
@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);
}
}
Gdzie CompatUtils.isApiNonLowerThan
:
public static boolean isApiNonLowerThan(int versionCode) {
return Build.VERSION.SDK_INT >= versionCode;
}
Różnica polega na tym, że nie ma dodatkowej zmiennej lokalnej, a wycofanie następuje tylko w else
oddziale. Dlatego nie spowoduje to pominięcia wszystkich metod oprócz pojedynczej gałęzi.
Może to pomóc, gdy Google zdecyduje się w niektórych przyszłych wersjach Androida na wycofanie nawet tej fromHtml(String source, int flags)
metody.
Możesz użyć
//noinspection deprecation
return Html.fromHtml(source);
aby ukryć inspekcję tylko dla pojedynczej instrukcji, ale nie dla całej metody.
Klasa frameworka została zmodyfikowana, aby wymagać flagi do informowania fromHtml()
sposobie przetwarzania linii. Zostało to dodane w Nougat i dotyczy tylko problemu niezgodności tej klasy we wszystkich wersjach Androida.
Opublikowałem bibliotekę kompatybilności, aby ustandaryzować i backportować klasę oraz zawierać więcej wywołań zwrotnych elementów i stylów:
Chociaż jest podobny do klasy Html frameworka, konieczne były pewne zmiany sygnatur, aby umożliwić więcej wywołań zwrotnych. Oto przykład ze strony 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
i targetSdkVersion 23
pojawia się błąd kompilacji dla wartości v24.xml : Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'.
Twoja biblioteka jest oczywiście docelowa na poziomie API 25. Jak mogę go nadal używać?
po prostu wykonaj funkcję:
public Spanned fromHtml(String str){
return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
}
Spróbuj wykonać poniższe czynności, aby obsługiwać podstawowe tagi HTML, w tym tagi ul ol li. Utwórz moduł obsługi znaczników, jak pokazano poniżej
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;
}
}
}
}
}
Ustaw tekst w polu Aktywność, jak pokazano poniżej
@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();
}
}
I tekst HTML w plikach ciągów zasobów jako
<! [CDATA [... surowe dane HTML ...]]>