渲染简单HTML片段的方法

发布于 2024-10-31 11:27:23 字数 546 浏览 1 评论 0原文

我正在编写一个用于访问 StackExchange 的 Android 应用程序,并且正在寻找处理渲染 StackExchange API 中使用的简单 HTML 片段的最佳方法。 API 中唯一的 HTML 位于问题、答案和评论的正文中。当然,注释使用的是更受限制的 HTML 子集。大多数 HTML 只是简单的格式,如

 等,但也有还需要处理  和偶尔的  标记。我正在考虑尝试使用 TextView 并用样式替换 HTML,但这可能限制太多。我看了一下 WebView,但这似乎有些过分了。 WebView 似乎用于加载外部动态内容并启动多个线程。我只计划渲染 API 中提供的简单、固定的 HTML,不包含任何 CSS 或 JavaScript。

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

I am writing an Android app for accessing StackExchange and I am looking for the best way to handle rendering the simple HTML fragments used in the StackExchange API. The only HTML in the API are in the bodies of questions, answers, and comments. Comments, of course, use a more restricted subset of HTML. Most of the HTML is just simple formatting like <p>, <b>, <pre>, etc. but there are also <a> and the occasional <img> tag to deal with. I was considering just trying to use a TextView and replace the HTML with styling, but that might be too restrictive. I took a look at WebView, but that almost seems overkill. WebViews seem to be for loading external dynamic content and start multiple threads. I'm only planning on rendering simple, fixed HTML provided in the API which does not include any CSS or JavaScript.

Also, I'm having an encoding issue with WebViews where characters like curly quotes show up as multiple characters where they display fine when used in a TextView.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

闻呓 2024-11-07 11:27:23

您可以做的是使用 Html.fromHtml() 函数

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

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

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

What you can do is use the Html.fromHtml() function.

It will leave you with a Spanned - type object. You might use the seperate spans on the locations to handle the tags?

An example to edit tags.
Situations: a text with html tags, that work using html.fromhtml. But sometimes the urls are relative (using "/file.html" instead of "http://domain.com/file.html") and so it can't be used. Sending the spannable to my function below finds all spans for a URL and adds the domain. You could use somehting else ofcourse for your specific tags:

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;
}

I'm not sure this is the most efficient way to do it, is was one of my first connections to spannables, but at least it shows some tricks you can do with spannables :D

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文