我正在从EditText框中获取Spanned Text,并使用HTML.toHtml将其转换为HTML标记的字符串。这很好用。我已验证字符串是否正确,并在适当的位置包含<br>
。但是,当我将标记的字符串转换回跨区文本以使用HTML.fromHtml填充TextView或EditText时,第一段末尾的<br>
(或多个,如果它们存在)消失。这意味着如果用户输入带有多个换行符的文本并希望保留该格式,则会丢失。
我附上了一张照片以帮助说明这一点。第一个EditText是用户输入,TextView下面是它上面的EditText的HTML.tohtml结果,下面的EditText使用HTML.fromHtml使用上面TextView中的字符串填充。正如您所看到的,换行符已经消失,因此有额外的行。此外,当第二个编辑文本的跨区文本通过HTML.toHtml运行时,它现在生成一个不同的HTML标记字符串。
我希望能够从第一个EditText中获取HTML标记的String,并填充其他TextViews或EditTexts,而不会丢失换行符和格式。
由于
答案 0 :(得分:10)
我也有这个问题,我找不到一个简单的“转换”或类似的解决方案。注意一些重要的事情,当用户按下“enter”时,java会生成特殊字符\n
,但在HTML中没有这样的换行格式。这是<br />
。
所以我所做的就是用纯文本替换某些特定的CharSequence
替换HTML格式。在我的情况下,只有“输入”字符,所以它不是那么混乱。
答案 1 :(得分:5)
当我尝试将editText内容保存/恢复到db时,我遇到了类似的问题。问题在于Html.toHtml,它以某种方式跳过线刹:
String src = "<p dir=\"ltr\">First line</p><p dir=\"ltr\">Second<br/><br/><br/></p><p dir=\"ltr\">Third</p>";
EditText editText = new EditText(getContext());
// All line brakes are correct after this
editText.setText(new SpannedString(Html.fromHtml(src)));
String result = Html.toHtml(editText.getText()); // Here breaks are lost
// Output :<p dir="ltr">First line</p><p dir="ltr">Second<br></p><p dir="ltr">Third</p>
我通过使用自定义toHtml函数来序列化跨区文本,并用“&lt; br /&gt;:”
public class HtmlParser {
public static String toHtml(Spannable text) {
final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
int start, end;
// Replace Style spans with <b></b> or <i></i>
StyleSpan[] styleSpans = ssBuilder.getSpans(0, text.length(), StyleSpan.class);
for (int i = styleSpans.length - 1; i >= 0; i--) {
StyleSpan span = styleSpans[i];
start = ssBuilder.getSpanStart(span);
end = ssBuilder.getSpanEnd(span);
ssBuilder.removeSpan(span);
if (span.getStyle() == Typeface.BOLD) {
ssBuilder.insert(start, "<b>");
ssBuilder.insert(end + 3, "</b>");
} else if (span.getStyle() == Typeface.ITALIC) {
ssBuilder.insert(start, "<i>");
ssBuilder.insert(end + 3, "</i>");
}
}
// Replace underline spans with <u></u>
UnderlineSpan[] underSpans = ssBuilder.getSpans(0, ssBuilder.length(), UnderlineSpan.class);
for (int i = underSpans.length - 1; i >= 0; i--) {
UnderlineSpan span = underSpans[i];
start = ssBuilder.getSpanStart(span);
end = ssBuilder.getSpanEnd(span);
ssBuilder.removeSpan(span);
ssBuilder.insert(start, "<u>");
ssBuilder.insert(end + 3, "</u>");
}
replace(ssBuilder, '\n', "<br/>");
return ssBuilder.toString();
}
private static void replace(SpannableStringBuilder b, char oldChar, String newStr) {
for (int i = b.length() - 1; i >= 0; i--) {
if (b.charAt(i) == oldChar) {
b.replace(i, i + 1, newStr);
}
}
}
}
事实证明,这种方式比默认的Html.toHtml()大约快4倍:我已经制作了大约20页和200跨度的基准:
Editable ed = editText.getText(); // Here is a Tao Te Ching :)
String result = "";
DebugHelper.startMeasure("Custom");
for (int i = 0; i < 10; i++) {
result = HtmlParserHelper.toHtml(ed);
}
DebugHelper.stopMeasure("Custom"); // 19 ms
DebugHelper.startMeasure("Def");
for (int i = 0; i < 10; i++) {
result = Html.toHtml(ed);
}
DebugHelper.stopMeasure("Def"); // 85 ms
答案 2 :(得分:0)
替换/ n =&gt; &LT; BR&GT;&LT; BR&GT;
示例
&LT; p为H.喜&LT; / p为H. &LT; p为H. J&LT; / p为H.
为:
&LT; p为H.喜&LT; / p为H.&LT; BR&GT;&LT; BR&GT;&LT; p为H. J&LT; / p为H.