0

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

此外,我遇到了 WebViews 的编码问题,其中像花括号这样的字符显示为多个字符,在 TextView 中使用时它们显示良好。

4

1 回答 1

1

您可以做的是使用该Html.fromHtml() 功能

它会给你一个Spanned- 类型的对象。您可能会使用位置上的单独跨度来处理标签?

编辑标签的示例。情况:带有 html 标签的文本,使用 html.fromhtml 工作。但有时 url 是相对的(使用“/file.html”而不是“http://domain.com/file.html”),因此无法使用。将 spannable 发送到下面的函数会找到 URL 的所有 span 并添加域。您可以为您的特定标签使用 somehting else ofcourse:

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

于 2011-04-09T12:28:32.360 回答