用于呈现简单HTML片段的方法

时间:2011-04-09 12:16:04

标签: android android-widget html-parsing stackexchange

我正在编写一个用于访问StackExchange的Android应用程序,我正在寻找处理渲染StackExchange API中使用的简单HTML片段的最佳方法。 API中唯一的HTML是问题,答案和评论的主体。当然,评论使用更受限制的HTML子集。大多数HTML只是简单的格式,如<p><b><pre>等,但也有<a>和偶尔的<img>标记来处理。我正在考虑尝试使用TextView并用样式替换HTML,但这可能过于严格。我看了一下WebView,但这几乎看起来有些过分。 WebViews似乎用于加载外部动态内容并启动多个线程。我只打算渲染API中提供的简单,固定的HTML,不包含任何CSS或JavaScript。

另外,我遇​​到了WebViews的编码问题,其中像弯引号这样的字符显示为多个字符,在TextView中使用时它们显示正常。

1 个答案:

答案 0 :(得分:1)

您可以使用Html.fromHtml() function

它将为您留下Spanned类型的对象。您可以在位置上使用单独的跨度来处理标记吗?

编辑标签的示例。 情境:带有html标签的文本,使用html.fromhtml工作。但有时网址是相对的(使用“/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