Способ рендеринга простых фрагментов HTML

#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. Я добавил пример, просто чтобы показать, что вы можете сделать 🙂