2012-07-24 16 views
9

Estoy tomando Texto extendido de un cuadro Editar texto y lo estoy convirtiendo en una cadena etiquetada HTML utilizando HTML.toHtml. Esto funciona bien He verificado que la cadena es correcta y contiene un
en la ubicación adecuada. Sin embargo, cuando llegué a convertir la cadena etiquetada de nuevo a un texto extendido para rellenar un TextView o EditText con HTML.fromHtml, desaparecen
(o varios si están presentes) al final del primer párrafo. Esto significa que si un usuario ingresaba texto con múltiples saltos de línea y quería mantener ese formato, se pierde.HTML.fromHtml La línea se interrumpe al desaparecer

Adjunto una imagen para ayudar a ilustrar esto. El primer EditText es la entrada del usuario, TextView Below es el resultado HTML.tohtml del EditText que está arriba, EditText debajo se llena usando HTML.fromHtml usando la cadena en el TextView encima de él. Como puede ver, los saltos de línea han desaparecido y también las líneas adicionales. Además, cuando el texto distribuido del segundo texto de edición se ejecuta a través del HTML.toHtml, ahora produce una cadena HTML etiquetada diferente. enter image description here

Me gustaría ser capaz de tomar el código HTML marcado Cadena de la primera EditarTexto y poblar otros TextViews o EditTexts sin perder los saltos de línea y el formato. Cualquier sugerencia sería útil.

Gracias

Respuesta

9

yo también tenía este problema y no pude encontrar una solución fácil por igual "transformar" o algo así. Tenga en cuenta algo importante, cuando el usuario presiona "enter", java produce el carácter especial \n, pero en HTML no existe ese formato para el salto de línea. Es el <br />.

Así que lo que he hecho fue reemplazar algunos específicos CharSequence s, desde el texto sin formato, por el formato HTML alternativo. En mi caso, solo había el carácter de "entrar", así que no era tan complicado.

0

Reemplazar/n => < br> < br>

ejemplo

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

a:

< p> hola </p> < br> < br> < p> j </p>

2

Tuve un problema similar cuando estaba tratando de guardar/restaurar el contenido de edición de texto a db. El problema está en Html.toHtml, que de alguna manera se salta los frenos de línea:

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> 

He resuelto esto mediante el uso de encargo ToHTML funcionar para serializar el texto distribuido, y se sustituye toda '\ 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); 
       } 
      } 
     } 
} 

también resultó que de esta manera es más rápido en aproximadamente 4 veces mayor que por defecto Html.toHtml(): he hecho un punto de referencia con alrededor de 20 páginas y 200 tramos:

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

me encanta tu hombre. ¡Hiciste mi día! – michoprogrammer

Cuestiones relacionadas