2012-07-24 14 views
9

Sto prendendo Spanning Text da una finestra EditText e lo converto in una stringa taggata HTML usando HTML.toHtml. Funziona bene Ho verificato che la stringa sia corretta e contenga un
nella posizione appropriata. Tuttavia, quando ho avuto modo di convertire la stringa taggata in un testo con spanning per popolare una TextView o EditText usando HTML.fromHtml, lo
(o multipli se presenti) alla fine del primo paragrafo scomparirà. Ciò significa che se un utente immette del testo con interruzioni di riga multiple e desidera mantenere quella formattazione, si perde.HTML.fromHtml Line Breaks Disappearing

Ho allegato un'immagine per illustrare questo. Il primo EditText è l'input dell'utente, il TextView Sotto è il risultato HTML.tohtml del EditText sopra di esso, il EditText sotto è popolato usando HTML.fromHtml usando la stringa nella TextView sopra di esso. Come puoi vedere, le interruzioni di riga sono scomparse e anche le linee extra. Inoltre, quando il testo con spanning del secondo testo di modifica viene eseguito tramite HTML.toHtml, ora produce una stringa con tag HTML diversa. enter image description here

Mi piacerebbe essere in grado di prendere il codice HTML etichettato String dal primo EditText e popolare altri TextViews o EditTexts senza perdere interruzioni di riga e la formattazione. Qualsiasi suggerimento sarebbe utile.

Grazie

risposta

9

Ho anche avuto questo problema e non sono riuscito a trovare una soluzione allo stesso modo facile "trasformare" o qualcosa del genere. Nota qualcosa di importante, quando l'utente preme "invio" java produce il carattere speciale \n ma in HTML non esiste un tale formato per l'interruzione di riga. È lo <br />.

Quindi quello che ho fatto è stato quello di sostituire alcuni specifici CharSequence s, dal testo normale, dal formato HTML alternativo. Nel mio caso c'era solo il carattere "entra" quindi non era così disordinato.

0

Sostituire/n => < br> < br>

esempio

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

a:

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

2

Ho avuto un problema simile quando stavo cercando di salvare/ripristinare il contenuto editText in db. Il problema è in Html.toHtml, salta in qualche modo i freni di linea:

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> 

Ho risolto questo utilizzando personalizzato ToHTML funzionare per serializzare il testo con spanning, e sostituita all '\ n' con "< 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); 
       } 
      } 
     } 
} 

Inoltre si è scoperto che in questo modo è più veloce in circa 4 volte quella di default Html.toHtml(): ho fatto un punto di riferimento con circa 20 pagine e 200 campate:

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

amo tu uomo, hai reso la mia giornata! – michoprogrammer