1

我有一段要突出显示的 HTML。它不是一段预定义的文本,所以它必须是动态的。

我有一个SpannableString有很多 html,但我想设置<pre>标签和<code>标签的样式。我可以使用一些标准的 Java API 或 Android API 来做到这一点,还是必须使用某种正则表达式来匹配这些标签?

我尝试过这样的事情:

public static void styleSpans(String markdownString) {
    Spannable raw = new SpannableString(markdownString);
    BackgroundColorSpan[] spans = raw.getSpans(0, raw.length(), BackgroundColorSpan.class);

    for (BackgroundColorSpan span : spans) {
        raw.removeSpan(span);
    }

    int index = TextUtils.indexOf(raw, "<pre>");
}

并对这些标签的索引做一些事情,但我需要一个例子来知道我实际上在做什么。我怎么能这样做?

4

1 回答 1

1

正则表达式是执行此操作的一种方法。

Matcher matcher = Pattern.compile("<pre>(.+?)</pre>", Pattern.DOTALL).matcher(markdownString);
// use matcher object to construct Spannable

或者,类android.text.Html具有方法fromHtml(String, Html.ImageGetter, Html.TagHandler),但它将所有可以转换的标签转换为跨度。标签<pre><code>不受支持,因此它们被传递到android.text.Html.TagHandler.handleTag(boolean, String, Editable, XMLReader)您必须覆盖的位置。在那里,您可以自己添加适当的跨度甚至额外的文本。学习如何将不同标签的支持写入到 handleTag 中的最佳位置可能是内部类的源代码android.text.Html.HtmlToSpannedConverter。在您的情况下,这似乎太重了,因为您需要剥离大量 Span 以仅以纯文本形式显示所有其他标签。

第三种选择是使用 SAX Parser。我认为这是最好的选择,它在Html.fromHtml(). 这是一个教程:http ://www.verious.com/tutorial/android-sax-parsing-example/ 。在您仅定义<pre>和的地方创建处理程序<code>。解析器应该使用这些标签并只告诉您标签何时开始(这样您就可以标记 Span 的开始),它为您提供标签的内容,最后它告诉您标签何时结束(在那里关闭您的 Span)。对于所有其他标签,只需将内容附加到 Spannable

于 2013-06-18T09:39:37.540 回答