Способ рендеринга простых фрагментов HTML - PullRequest
0 голосов
/ 09 апреля 2011

Я пишу приложение для Android для доступа к StackExchange и ищу лучший способ обработки рендеринга простых фрагментов HTML, используемых в API StackExchange. Единственный HTML в API находится в теле вопросов, ответов и комментариев. Комментарии, конечно, используют более ограниченное подмножество HTML. Большая часть HTML - это просто простое форматирование, такое как <p>, <b>, <pre> и т. Д., Но есть также <a> и случайный тег <img> для работы. Я подумывал просто попытаться использовать TextView и заменить HTML стилем, но это может быть слишком ограничительным. Я взглянул на WebView, но это кажется излишним. Кажется, что WebViews предназначены для загрузки внешнего динамического контента и запуска нескольких потоков. Я только планирую рендеринг простого фиксированного HTML-кода, предоставляемого в API, который не включает в себя CSS или JavaScript.

Кроме того, у меня возникла проблема с кодированием веб-представлений, когда такие символы, как фигурные кавычки, отображаются в виде нескольких символов, где они отображаются нормально при использовании в TextView.

1 Ответ

1 голос
/ 09 апреля 2011

Что вы можете сделать, это использовать функцию 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

...