html.fromhtml android example
La lĂnea HTML.fromHtml se rompe y desaparece (3)
Estoy tomando Texto extendido de un cuadro Editar texto y convirtiéndolo en una cadena etiquetada HTML utilizando HTML.toHtml. Esto funciona bien He verificado que la cadena es correcta y contiene un
en el lugar apropiado. Sin embargo, cuando llegué a convertir la cadena etiquetada de nuevo a un texto cruzado para llenar un TextView o EditText usando HTML.fromHtml el
(o múltiples si están presentes) al final del primer párrafo desaparecen. Esto significa que si un usuario ingresaba texto con múltiples saltos de línea y quería mantener ese formato, se pierde.
Adjunté 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 arriba. 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.
Me gustaría poder tomar la Cadena etiquetada HTML del primer EditText y rellenar otras TextViews o EditTexts sin perder saltos de línea ni formatear. Cualquier sugerencia sería útil.
Gracias
También tuve este problema y no pude encontrar una solución fácil de "transformación" o algo parecido. 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 />
.
Entonces, lo que hice fue reemplazar algunos CharSequence
s específicos, del texto plano, por el formato HTML alternativo. En mi caso, solo había el carácter de "entrar", así que no era tan complicado.
Reemplazar / n => <br> <br>
ejemplo
<p> hi </ p> <p> j </ p>
a:
<p> hi </ p> <br> <br> <p> j </ p>
Tuve un problema similar cuando estaba tratando de guardar / restaurar el contenido de EditText a db. El problema está en Html.toHtml, 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>
Lo resolví utilizando la función personalizada toHtml para serializar el texto distribuido, y reemplacé todo ''/ 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 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