HTML.fromHtml换行消失

我从一个EditText框中取出Spanned Text,并使用HTML.toHtml将其转换为HTML标记的string。 这工作正常。 我已经validation了该string是正确的,并包含一个
在适当的位置。 但是,当我需要将带标签的string转换回spanned文本来使用HTML.fromHtml填充TextView或EditText
(或多个如果他们在场)在第一段的末尾消失。 这意味着如果用户input了多个换行符的文本,并希望保持格式化,则会丢失。

我附上了一张照片来帮助说明这一点。 第一个EditText是用户input,TextView下面是它上面的EditText的HTML.tohtml结果,下面的EditText是使用HTML.fromHtml使用上面的TextView中的string填充的。 正如你所看到的,换行符已经消失了,所以有额外的行。 此外,当第二个编辑文本的跨越文本通过HTML.toHtml运行时,它现在生成一个不同的HTML标记的string。 在这里输入图像说明

我希望能够从第一个EditText采取HTML标记的string,并填充其他TextViews或EditTexts,而不会丢失换行符和格式。 任何的意见都将会有帮助。

谢谢

Solutions Collecting From Web of "HTML.fromHtml换行消失"

我也有这个问题,我找不到一个简单的“转换”或类似的解决scheme。 注意一些重要的事情,当用户按下“enter”时,java产生特殊字符\n但是在HTML中没有这样的换行格式。 这是<br />

所以我所做的就是用另一种HTML格式来replace纯文本中的一些特定的CharSequence 。 在我的情况下,只有“进入”字符,所以不是那么混乱。

当我尝试将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函数来解决这个问题,以串行化spanned文本,并用“”replace所有'\ n':

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

另外,事实certificate,这种方式比默认的Html.toHtml()大约快了4倍:我做了大约20页和200个跨度的基准testing:

  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 

replace/ n => <br>

嗨</ p> <p> j </ p>

至:

嗨</ p> <p> </ p> <p>