Znacznik listy HTML nie działa w Android TextView. Oto zawartość mojego ciągu:
String str="A dressy take on classic gingham in a soft, textured weave of stripes that resembles twill. Take a closer look at this one.<ul><li>Trim, tailored fit for a bespoke feel</li><li>Medium spread collar, one-button mitered barrel cuffs</li><li>Applied placket with genuine mother-of-pearl buttons</li><li>;Split back yoke, rear side pleats</li><li>Made in the U.S.A. of 100% imported cotton.</li></ul>";
Załadowałem go w widoku tekstowym takim jak ten:
textview.setText(Html.fromHtml(str));
Wynik wygląda jak akapit. Co mogę zrobić? Czy jest na to jakieś rozwiązanie?
Edytować:
webview.loadData(str,"text/html","utf-8");
Odpowiedzi:
Jak widać w
Html
kodzie źródłowym klasy ,Html.fromHtml(String)
nie obsługuje wszystkich tagów HTML. W tym przypadku<ul>
i<li>
nie są obsługiwane.Z kodu źródłowego zbudowałem listę dozwolonych tagów HTML:
br
p
div
em
b
strong
cite
dfn
i
big
small
font
blockquote
tt
monospace
a
u
sup
sub
Więc lepiej użyj
WebView
i jegoloadDataWithBaseURL
metody. Spróbuj czegoś takiego:źródło
Mam ten sam problem, co zrobiłem, to zastąpienie domyślnego TagHandler . Ten pracował dla mnie.
i do wyświetlania tekstu ...
[Edytować]
Kuitsi opublikował również naprawdę dobrą bibliotekę, która robi to samo, pobrała ją z tego linku SO .
źródło
Pełny przykładowy projekt znajduje się pod adresem https://bitbucket.org/Kuitsi/android-textview-html-list .
Przykładowe zdjęcie jest dostępne pod adresem https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png
To rozwiązanie jest najbliższe odpowiedzi Maszy . Część kodu jest również pobierana z klasy wewnętrznej
android.text.Html.HtmlToSpannedConverter
. Obsługuje zagnieżdżone listy uporządkowane i nieuporządkowane, ale zbyt długie teksty na listach uporządkowanych są nadal wyrównane do numeru pozycji, a nie do tekstu. Listy mieszane (ol i ul) też wymagają trochę pracy. Przykładowy projekt zawiera implementację Html.TagHandler, która jest przekazywana do Html.fromHtml (String, ImageGetter, TagHandler) .Edycja: aby uzyskać szerszą obsługę tagów HTML, warto również spróbować https://github.com/NightWhistler/HtmlSpanner .źródło
output.length() > 0
jak wif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
Mała poprawka do kodu Aman Guatam. Powyższa funkcja ma problem z renderowaniem znaku nowej linii. Na przykład: jeśli przed
<li>
tagiem jest<p>
tag, renderowane są 2 znaki nowej linii. Oto ulepszony kod:źródło
OSTRZEŻENIE
od 10 lutego 2016 r.
android.text.Html
faktycznie obsługujeli
iul
taguje oraz używa podstawowegonew BulletSpan()
, co oznacza, że w najnowszych wersjach AndroidaHtml.TagHandler
zamieszczone tutaj rozwiązania będą ignorowaneupewnij się, że twój kod obsługuje tę zmianę na wypadek, gdyby spodziewasz się BulletSpan z większą przerwą niż domyślna, będziesz musiał mieć jakieś rozwiązanie, które wykonuje wyszukiwanie / zamianę rozpiętości
źródło
N
i nowszych.Inne rozwiązanie wykorzystujące LeadingMarginSpan. Obsługuje listy uporządkowane i nieuporządkowane, a także zagnieżdżanie.
źródło
output.setSpan(...)
java.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Jeśli potrzebujesz tylko sformatować listę, zachowaj prostotę i skopiuj / wklej znak Unicode w swoim TextView, aby osiągnąć ten sam wynik.
• Znak Unicode „BULLET” (U + 2022)
źródło
Przyszedłem tutaj, szukając implementacji TagHandler. Odpowiedzi Truong Nguyen i Aman Guatam są bardzo ładne, ale potrzebowałem mieszanej wersji obu: potrzebowałem mojego rozwiązania, aby go nie przeformatować i móc rozwiązać
<ol>
tagi, ponieważ parsuję coś takiego<h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>
.Oto moje rozwiązanie.
Zwróć uwagę, że ponieważ resetujemy wartość indeksu za każdym razem, gdy rozpoczyna się nowa lista, NIE BĘDZIE to działać, jeśli zagnieżdżasz listy, takie jak w
<ol><li>1<ol><li>1.1</li><li>1.2</li></ol><li>2</li></ol>
Z tym kodem otrzymasz
1, 1, 2, 3
zamiast1, 1, 2, 2
.źródło
Jasne, istnieje sposób na wyświetlanie punktorów w Android TextView. Możesz zamienić
<li>
tagi na•
(co jest kodem HTML punktora).Jeśli chcesz wypróbować inne ikony listy, użyj preferowanej ikony z tabeli to ten link;
http://www.ascii-code.com/
źródło
Możesz po prostu zamienić „li” na unicodes
źródło
Odpowiedź Lorda Voldermorta jest dobrym punktem wyjścia. Jednak
ol
wymagałem, aby tag wyświetlał uporządkowaną listę1. 2. 3. ....
zamiast punktorów. Ponadto zagnieżdżone znaczniki wymagają specjalnej obsługi, aby działały prawidłowo.W moim kodu, mam utrzymuje stos (parentList) śledzić otwierane i zamykane
ul
iol
tagi, a także znać aktualny znacznik otwarty. Ponadto alevelWiseCounter
służy do utrzymywania różnych liczników w przypadku zagnieżdżonychol
tagów.. . .
źródło
A co z następnym kodem (na podstawie tego linku ):
źródło
Miałem problem, że zawsze otrzymywałem pusty wiersz po liście z rozwiązaniem @Kuitsis. Dodałem kilka linii w handleTag () i teraz puste linie zniknęły:
źródło
Możesz użyć
Html.TagHandler
. Poniżej można użyć kotlini
źródło
jest to potwierdzenie tego, co powiedział Kassim. występuje fragmentacja. znalazłem, jak to rozwiązać. muszę zmienić nazwę
<li>
i ul na niestandardowy tag. więc:wtedy w moim handlerze mogę poszukać tego customTag (który nic nie robi) i sprawić, żeby coś zrobił.
to powinno działać na wszystkich wersjach Androida.
źródło