HTML.fromHtml Saltos de línea que desaparecen
Estoy tomando el texto extenso de un cuadro de EditText y convertirlo a una cadena etiquetada HTML usando HTML.toHtml. Esto funciona bien. He verificado que la cadena es correcta y contiene una
En el lugar apropiado. Sin embargo, cuando llegué a convertir la cadena etiquetada de nuevo a un texto extendido para rellenar un TextView o EditText utilizando HTML.fromHtml el
(O varios si están presentes) al final del primer párrafo desaparecen. Esto significa que si un usuario introdujo texto con múltiples saltos de línea y quería mantener ese formato se pierde.
Adjunto una foto para ayudar a ilustrar esto. El primer EditText es la entrada del usuario, el TextView debajo es el resultado HTML.tohtml del EditText encima de él, el EditText debajo se rellena usando HTML.fromHtml usando la cadena en el TextView encima de él. Como se puede ver los saltos de línea han desaparecido y por lo que tienen las líneas extra. Además, cuando el texto extendido del segundo texto de edición se ejecuta a través de HTML.toHtml, ahora produce una cadena etiquetada HTML diferente.
- Hacer una vista de texto de hipervínculo en android
- Android Textview Italic y wrap_contents
- TextView android: ellipsize = "marquee" no funciona como se esperaba
- Vista de texto no desplazable en android
- Android: muestra un cuadro de diálogo emergente cuando se hace clic en una palabra concreta de TextView
Me gustaría poder tomar la cadena etiquetada HTML del primer EditText y poblar otros TextViews o EditTexts sin perder los saltos de línea y formatear. Cualquier sugerencia sería útil.
Gracias
- Restablecer la posición de TextView (desplazable) en la nueva carga de texto
- Cómo insertar texto en textview en android
- Centrar el contenido de TextView vertical y horizontalmente - LinearLayout
- Presentación de texto de Android TextView vs WebView
- Android Html.fromHtml función automática convierte texto no deseado en hipervínculos
- ¿Cómo obtener el nombre de la familia fontFamily de TextView?
- Cómo insertar texto extraíble
- TextView ClickableSpan estilo para estado pulsado
También tuve este problema y no pude encontrar una fácil "transformar" o algo similar solución. Tenga en cuenta algo importante, cuando el usuario presiona "enter" java produce el carácter especial \n
pero en HTML no existe un formato para la ruptura de línea. Es el <br />
.
Así que lo que he hecho fue reemplazar algunos CharSequence
específicos, a partir del texto sin formato, por el formato HTML alternativo. En mi caso, sólo había el "entrar" carácter por lo que no era tan desordenado.
Tuve un problema similar cuando estaba tratando de guardar / restaurar el contenido editText a db. El problema está en Html.toHtml, de alguna manera salta 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 usando la función toHtml personalizada para serializar el texto dividido, y reemplazó todos los '\ 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 esta forma es más rápida en alrededor de 4 veces que el valor predeterminado 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
Reemplazar / n => <br> <br>
ejemplo
<P> hola </ p> <p> j </ p>
a:
<P> Hola </ p> <br> <p> <p> j </ p>
- Color del texto del botón AlertDialog con la biblioteca de soporte v24.2.1
- ¿Cómo se ejecutan las pruebas de instrumentación de Android de Eclipse?