是否可以以逐字模式或类似方式解析HTML代码,以便最终可能出现的源代码片段(包含在前和代码 HTML标记之间)可以正确显示吗?
我想要做的是以用户友好的模式显示源代码(易于与文本的其余部分区分,保持缩进等),如Stack Overflow所做的那样:)
似乎Html.fromHtml()仅支持reduced subset个HTML标记。
答案 0 :(得分:1)
TextView
永远不会成功支持你想要的所有html格式和样式。请改用WebView
。
TextView
是本机的,更轻量级,但正因为它的轻量级,它不会理解你描述的一些指令。
答案 1 :(得分:0)
最后,我自己编写了收到的HTML代码,因为Html.fromHtml不支持pre
和code
标记,y用我的自定义格式替换它们并预解析这些标记内的代码用<br/>
替换“\ n”,用
替换“”。
然后我将结果发送到Html.fromHtml,结果很好:
public class HtmlParser {
public static Spanned parse(String text) {
if (text == null) return null;
text = parseSourceCode(text);
Spanned textSpanned = Html.fromHtml(text);
return textSpanned;
}
private static String parseSourceCode(String text) {
if (text.indexOf(ORIGINAL_PATTERN_BEGIN) < 0) return text;
StringBuilder result = new StringBuilder();
int begin;
int end;
int beginIndexToProcess = 0;
while (text.indexOf(ORIGINAL_PATTERN_BEGIN) >= 0) {
begin = text.indexOf(ORIGINAL_PATTERN_BEGIN);
end = text.indexOf(ORIGINAL_PATTERN_END);
String code = parseCodeSegment(text, begin, end);
result.append(text.substring(beginIndexToProcess, begin));
result.append(PARSED_PATTERN_BEGIN);
result.append(code);
result.append(PARSED_PATTERN_END);
//replace in the original text to find the next appearance
text = text.replaceFirst(ORIGINAL_PATTERN_BEGIN, PARSED_PATTERN_BEGIN);
text = text.replaceFirst(ORIGINAL_PATTERN_END, PARSED_PATTERN_END);
//update the string index to process
beginIndexToProcess = text.lastIndexOf(PARSED_PATTERN_END) + PARSED_PATTERN_END.length();
}
//add the rest of the string
result.append(text.substring(beginIndexToProcess, text.length()));
return result.toString();
}
private static String parseCodeSegment(String text, int begin, int end) {
String code = text.substring(begin + ORIGINAL_PATTERN_BEGIN.length(), end);
code = code.replace(" ", " ");
code = code.replace("\n","<br/>");
return code;
}
private static final String ORIGINAL_PATTERN_BEGIN = "<pre><code>";
private static final String ORIGINAL_PATTERN_END = "</code></pre>";
private static final String PARSED_PATTERN_BEGIN = "<font color=\"#888888\"><tt>";
private static final String PARSED_PATTERN_END = "</tt></font>";
}