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