#android #android-widget #html-parsing #stackexchange
#Android #android-виджет #html-синтаксический анализ #stackexchange
Вопрос:
Я пишу приложение для Android для доступа к StackExchange и ищу наилучший способ обработки рендеринга простых фрагментов HTML, используемых в StackExchange API. Единственный HTML в API находится в телах вопросов, ответов и комментариев. В комментариях, конечно, используется более ограниченное подмножество HTML. Большая часть HTML-кода представляет собой простое форматирование, такое как <p>
, <b>
, <pre>
и т.д. Но есть также <a>
и случайные <img>
теги, с которыми приходится иметь дело. Я рассматривал возможность просто попробовать использовать TextView и заменить HTML на styling, но это может быть слишком ограничительным. Я взглянул на WebView, но это кажется почти излишним. Веб-просмотры, похоже, предназначены для загрузки внешнего динамического контента и запуска нескольких потоков. Я планирую рендерить только простой, исправленный HTML, предоставляемый в API, который не включает в себя ни CSS, ни JavaScript.
Кроме того, у меня возникла проблема с кодировкой WebViews, где символы, подобные фигурным кавычкам, отображаются в виде нескольких символов, где они отображаются нормально при использовании в TextView.
Ответ №1:
Что вы можете сделать, так это использовать Html.fromHtml()
функцию.
Это оставит вас с объектом Spanned
-типа. Вы могли бы использовать отдельные интервалы для местоположений для обработки тегов?
Пример редактирования тегов. Ситуации: текст с html-тегами, которые работают с использованием html.fromhtml. Но иногда URL-адреса являются относительными (с использованием «/file.html «вместо»http://domain.com/file.html «) и поэтому его нельзя использовать. Отправка spannable в мою функцию, приведенную ниже, находит все интервалы для URL-адреса и добавляет домен. Вы могли бы использовать что-то еще, конечно, для ваших конкретных тегов:
protected Spanned correctLinkPaths (Spanned spantext) {
Object[] spans = spantext.getSpans(0, spantext.length(), Object.class);
for (Object span : spans) {
int start = spantext.getSpanStart(span);
int end = spantext.getSpanEnd(span);
int flags = spantext.getSpanFlags(span);
if (span instanceof URLSpan) {
URLSpan urlSpan = (URLSpan) span;
if (!urlSpan.getURL().startsWith("http")) {
if (urlSpan.getURL().startsWith("/")) {
urlSpan = new URLSpan("http://www.domain.com" urlSpan.getURL());
} else {
urlSpan = new URLSpan("http://www.domain.com/" urlSpan.getURL());
}
}
((Spannable) spantext).removeSpan(span);
((Spannable) spantext).setSpan(urlSpan, start, end, flags);
}
}
return spantext;
}
Я не уверен, что это самый эффективный способ сделать это, это было одно из моих первых подключений к spannables, но, по крайней мере, он показывает некоторые трюки, которые вы можете выполнять с spannables : D
Комментарии:
1. Это определенно больше похоже на то, на что я надеялся. Мне придется немного поиграть с ним, чтобы посмотреть, делает ли он все, что мне нужно.
2. Я добавил пример, просто чтобы показать, что вы можете сделать 🙂