Тег HTML-списка не работает в Android TextView. Это мое строковое содержимое:
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>";
Я загрузил его в текстовом виде вот так:
textview.setText(Html.fromHtml(str));
Результат выглядит как абзац. Что я могу сделать? Есть ли какое-то решение?
Редактировать:
webview.loadData(str,"text/html","utf-8");
Ответы:
Как видно из
Html
исходного кода класса ,Html.fromHtml(String)
не поддерживаются все теги HTML. В данном случае<ul>
и<li>
не поддерживаются.Из исходного кода я составил список разрешенных тегов HTML:
br
p
div
em
b
strong
cite
dfn
i
big
small
font
blockquote
tt
monospace
a
u
sup
sub
Так что лучше воспользуйтесь
WebView
и егоloadDataWithBaseURL
методом. Попробуйте что-то вроде этого:источник
У меня та же проблема, что я сделал, это переопределил TagHandler по умолчанию . Этот сработал для меня.
и для отображения текста ...
[Редактировать]
Куитси также опубликовал действительно хорошую библиотеку, которая делает то же самое, полученная по этой ссылке SO .
источник
Полный пример проекта находится по адресу https://bitbucket.org/Kuitsi/android-textview-html-list .
Образец изображения доступен по адресу https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png.
Это решение наиболее близко к ответу Маши . Некоторый код также взят из внутреннего класса
android.text.Html.HtmlToSpannedConverter
. Он поддерживает вложенные упорядоченные и неупорядоченные списки, но слишком длинные тексты в упорядоченных списках по-прежнему выравниваются по номеру элемента, а не по тексту. Смешанные списки (ol и ul) тоже нуждаются в доработке. Пример проекта содержит реализацию Html.TagHandler, который передается в Html.fromHtml (String, ImageGetter, TagHandler) .Изменить: для более широкой поддержки тегов HTML, возможно, стоит попробовать https://github.com/NightWhistler/HtmlSpanner .источник
output.length() > 0
как вif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
Небольшое исправление в коде Aman Guatam. У функции выше есть проблема с отображением символа новой строки. Например: если перед
<li>
тегом является<p>
тег, отображаются 2 символа новой строки. Вот обновленный код:источник
ПРЕДУПРЕЖДЕНИЕ
по состоянию на 10 февраля 2016 г.
android.text.Html
фактически поддерживаетli
иul
теги и использует базовыеnew BulletSpan()
, что означает , в последних версиях Android отHtml.TagHandler
решения , размещенные здесь будут игнорироватьсяубедитесь, что ваш код обрабатывает это изменение, если вы ожидаете BulletSpan с большим промежутком, чем по умолчанию, вам нужно будет какое-то решение, которое выполняет поиск / замену промежутков
источник
N
и более поздних версиях .Другое решение с использованием LeadingMarginSpan. Обрабатывает упорядоченные и неупорядоченные списки, а также вложение.
источник
output.setSpan(...)
java.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Если вам нужно только отформатировать список, сделайте его простым и скопируйте / вставьте символ Юникода в свой TextView для достижения того же результата.
• Символ Юникода "BULLET" (U + 2022)
источник
Я пришел сюда в поисках реализации TagHandler. Оба ответа Truong Nguyen и Aman Guatam очень хороши, но мне нужна была смешанная версия обоих: мне нужно было мое решение, чтобы не переформатировать его и иметь возможность повторно распределять
<ol>
теги, поскольку я разбираю что-то вроде<h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>
.Вот мое решение.
Обратите внимание: поскольку мы сбрасываем значение индекса всякий раз, когда начинается новый список, он НЕ БУДЕТ работать, если вы вложите списки, как в
<ol><li>1<ol><li>1.1</li><li>1.2</li></ol><li>2</li></ol>
С этим кодом вы получите
1, 1, 2, 3
вместо1, 1, 2, 2
.источник
Конечно, в Android TextView есть способ отображать маркеры. Вы можете заменить
<li>
теги на•
(это HTML-код для маркера).Если вы хотите попробовать другие значки списка, используйте предпочтительный значок из таблицы - эта ссылка;
http://www.ascii-code.com/
источник
Вы можете просто заменить "li" на юникоды.
источник
Ответ лорда Волдерморта - хорошая отправная точка. Однако мне нужен
ol
тег для отображения упорядоченного списка1. 2. 3. ....
вместо маркеров. Кроме того, для правильной работы вложенных тегов требуется особая обработка.В моем коде, я поддерживал стек (parentList) следить за открытыми и закрытыми
ul
иol
тег , а также знать текущий открытый тег. Кроме того, alevelWiseCounter
используется для поддержания разных подсчетов в случае вложенныхol
тегов.. . .
источник
Как насчет следующего кода (по этой ссылке ):
источник
У меня была проблема, что после списка с решением @Kuitsis всегда появлялась пустая строка. Я добавил несколько строк в handleTag (), и теперь пустые строки исчезли:
источник
Вы можете использовать
Html.TagHandler
. Ниже можно использовать для котлинаи
источник
это подтверждение того, что сказал касим. есть фрагментация. Я нашел, как решить эту проблему. мне нужно переименовать
<li>
и ul в настраиваемый тег. так:затем в моем обработчике я могу найти этот customTag (который ничего не делает) и заставить его что-то делать.
это должно заставить его работать для всех версий Android.
источник