2012-07-24 6 views
9

Ich nehme gespannten Text von einer EditText-Box und wandle ihn in eine HTML-markierte Zeichenfolge mit HTML.toHtml um. Das funktioniert gut. Ich habe überprüft, dass die Zeichenfolge korrekt ist und eine
an dem entsprechenden Speicherort enthält. Wenn ich jedoch die markierte Zeichenfolge zurück zu einem übergreifenden Text konvertieren muss, um ein TextView oder EditText mit HTML.fromHtml zu füllen, verschwindet die
(oder mehrere, wenn sie vorhanden sind) am Ende des ersten Absatzes. Das bedeutet, wenn ein Benutzer Text mit mehreren Zeilenumbrüchen eingegeben hat und diese Formatierung beibehalten möchte, geht er verloren.HTML.fromHtml Zeilenumbrüche verschwindend

Ich habe ein Bild angehängt, um dies zu veranschaulichen. Der erste EditText ist die Benutzereingabe, der TextView darunter ist das HTML.tohtml Ergebnis des EditText darüber, der EditText darunter wird unter Verwendung von HTML.fromHtml mit der Zeichenfolge in der TextView darüber gefüllt. Wie Sie sehen können, sind die Zeilenumbrüche verschwunden und somit auch die zusätzlichen Zeilen. Wenn der übergreifende Text des zweiten Bearbeitungstextes durch HTML.toHtml läuft, erzeugt er nun einen anderen HTML-markierten String. enter image description here

Ich möchte in der Lage sein, die HTML zu nehmen String aus dem ersten EditText markiert und andere Textviews oder EditTexts bevölkern, ohne Zeilenumbrüche und Formatierung zu verlieren. Irgendwelche Vorschläge wären hilfreich.

Dank

Antwort

9

Ich hatte auch dieses Problem und ich konnte es nicht leicht „verwandeln“ oder etwas gleichermaßen Lösung finden. Beachten Sie etwas Wichtiges, wenn der Benutzer "Enter" drückt, erzeugt Java das Sonderzeichen \n, aber in HTML gibt es kein solches Format für Zeilenumbrüche. Es ist die <br />.

Also was ich getan habe, war, einige spezifische CharSequence s aus dem Klartext durch das alternative HTML-Format zu ersetzen. In meinem Fall gab es nur den "Enter" -Zeichen, also war es nicht so unordentlich.

0

Ersetzen/n => < br> < br>

Beispiel

< p> Hallo </p> < p> j </p>

zu:

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

2

Ich hatte ein ähnliches Problem, als ich versuchte, editText Inhalt zu db zu speichern/wiederherzustellen. Das Problem in Html.toHtml ist, überspringt es irgendwie Linie Bremsen:

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> 

ich diese Gewohnheit durch Verwendung gelöst haben toHtml funktionieren segmentierter Text serialisiert werden und ersetzt alle ‚\ n‘ mit "< 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); 
       } 
      } 
     } 
} 

auch stellte sich heraus, dass diese Art und Weise ist in etwa 4-mal schneller als Standard-Html.toHtml(): ich habe einen Benchmark mit etwa 20 Seiten gemacht und 200 Spannweiten:

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

ich liebe du Mann, du hast meinen Tag gemacht! – michoprogrammer