2012-07-24 171 views
9

我从EditText框中取出Spanned Text并使用HTML.toHtml将其转换为HTML标记的字符串。这工作正常。我已验证字符串是否正确,并在适当的位置包含
。但是,当我需要将标记字符串转换回spanned文本以使用HTML.fromHtml
(或多个如果存在的话)填充TextView或EditText时,第一段的末尾会消失。这意味着如果用户输入带有多个换行符的文本并希望保持格式化,则会丢失。HTML.fromHtml换行消失

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

我想能够采取的HTML标记的字符串从第一的EditText和填充其他TextViews或EditTexts不失换行符和格式。任何的意见都将会有帮助。

感谢

回答

9

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

所以我所做的就是用纯文本替换一些特定的CharSequence,使用替代的HTML格式。在我的情况下,只有“输入”字符,所以它不是那么混乱。

0

替换/ N => < BR> < BR>

例如

< P>喜</P> < P>Ĵ</P>

到:

< p> hi </p> < br> < br> < p> j </p>

2

当我试图将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连载跨区文本解决了这一点,并以“全部换成“\ n” < BR />:

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

而且事实证明,这种方式是约4倍的速度是默认Html.toHtml():我做了一个基准约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 
+0

我爱你的男人,你做了我的一天! – michoprogrammer 2016-12-28 16:28:41