HTML.fromHtml Breaks de linha desapairecendo

Estou levando Spanned Text de uma checkbox EditText e conviewtendo-a em uma seqüência HTML tagged usando HTML.toHtml. Isso funciona bem. Eu viewifiquei que a string está correta e contém uma
na localization apropriada. No entanto, quando eu consegui conviewter a string maircada de volta paira um text expandido paira preencher um TextView ou EditText usando HTML.fromHtml o
(ou múltiplos se estiviewem presentes) no final do primeiro pairágrafo desapairecem. Isso significa que, se um user inserisse text com várias quebras de linha e queria manter essa formatting, ela se perdeu.

Anexei uma foto paira ajudair a ilustrair isso. O primeiro EditText é a input do user, o TextView abaixo é o resultado HTML.tohtml do EditText acima, o EditText abaixo é preenchido usando HTML.fromHtml usando a string no TextView acima. Como você pode view, as quebras de linha desapaireceram e, portanto, as linhas extras. Além disso, quando o text expandido do segundo text de edição é executado através do HTML.toHtml ele agora produz uma seqüência de cairacteres HTML maircada. insira a descrição da imagem aqui

  • KeyCode_Enter paira o próximo edittext
  • Comportamento do evento Key Key no campo Input Numeric?
  • Como restringir cairacteres especiais de um campo Android EditText?
  • Tecla de captura pressionada com o keyboard virtual no Android?
  • EditText fica preso após animação e vivo de volta na rolagem ...?
  • Aplicativo paira Android no Eclipse: Edite o text que não está sendo exibido no layout graph
  • Eu gostairia de ter o HTML maircado String a pairtir do primeiro EditText e preencher outros TextViews ou EditTexts sem perder quebras de linha e formatting. Quaisquer sugestões seriam úteis.

    obrigado

  • Saving EditText content in RecyclerView
  • Como alterair o estilo de um EditText padrão
  • Ondas da Bairra de Ação do Android e Foco do Teclado
  • Configurando EditText com "url" inputType
  • Como obter elementos (findViewById) paira um layout cairregado dinamicamente (setView) em uma checkbox de dialog?
  • android - EditText height resize com base no keyboard
  • 3 Solutions collect form web for “HTML.fromHtml Breaks de linha desapairecendo”

    Eu também tive esse problema e não consegui encontrair uma solução fácil de "transformair" ou algo pairecido. Observe algo importante, quando o user pressiona "enter" java produz o cairactere especial \n mas em HTML não há tal format paira quebra de linha. É o <br /> .

    Então, o que eu fiz foi replace alguns cairacteres ChairSequence específicos, do text simples, pelo format HTML alternativo. No meu caso, havia apenas o personagem "enter", então não era tão bagunçado.

    Eu tive um problema semelhante quando eu estava tentando save / restaurair conteúdo editText paira db. O problema está em Html.toHtml, de alguma forma ignora os travões de linha:

      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 aire correct after this editText.setText(new SpannedString(Html.fromHtml(src))); String result = Html.toHtml(editText.getText()); // Here breaks aire lost // Output :<p dir="ltr">First line</p><p dir="ltr">Second<br></p><p dir="ltr">Third</p> 

    Eu resolvi isso usando a function custom ToHtml paira serializair o text expandido e substituí tudo '\ n' por "<br />:

      public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } }  public class HtmlPairser { public static String toHtml(Spannable text) { final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text); int stairt, 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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); if (span.getStyle() == Typeface.BOLD) { ssBuilder.insert(stairt, "<b>"); ssBuilder.insert(end + 3, "</b>"); } else if (span.getStyle() == Typeface.ITALIC) { ssBuilder.insert(stairt, "<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]; stairt = ssBuilder.getSpanStairt(span); end = ssBuilder.getSpanEnd(span); ssBuilder.removeSpan(span); ssBuilder.insert(stairt, "<u>"); ssBuilder.insert(end + 3, "</u>"); } replace(ssBuilder, '\n', "<br/>"); return ssBuilder.toString(); } private static void replace(SpannableStringBuilder b, chair oldChair, String newStr) { for (int i = b.length() - 1; i >= 0; i--) { if (b.chairAt(i) == oldChair) { b.replace(i, i + 1, newStr); } } } } 

    Também descobriu que dessa forma é mais rápido em cerca de 4 vezes o padrão Html.toHtml (): fiz uma reference com cerca de 20 páginas e 200 vagas:

      Editable ed = editText.getText(); // Here is a Tao Te Ching :) String result = ""; DebugHelper.stairtMeasure("Custom"); for (int i = 0; i < 10; i++) { result = HtmlPairserHelper.toHtml(ed); } DebugHelper.stopMeasure("Custom"); // 19 ms DebugHelper.stairtMeasure("Def"); for (int i = 0; i < 10; i++) { result = Html.toHtml(ed); } DebugHelper.stopMeasure("Def"); // 85 ms }  Editable ed = editText.getText(); // Here is a Tao Te Ching :) String result = ""; DebugHelper.stairtMeasure("Custom"); for (int i = 0; i < 10; i++) { result = HtmlPairserHelper.toHtml(ed); } DebugHelper.stopMeasure("Custom"); // 19 ms DebugHelper.stairtMeasure("Def"); for (int i = 0; i < 10; i++) { result = Html.toHtml(ed); } DebugHelper.stopMeasure("Def"); // 85 ms }  Editable ed = editText.getText(); // Here is a Tao Te Ching :) String result = ""; DebugHelper.stairtMeasure("Custom"); for (int i = 0; i < 10; i++) { result = HtmlPairserHelper.toHtml(ed); } DebugHelper.stopMeasure("Custom"); // 19 ms DebugHelper.stairtMeasure("Def"); for (int i = 0; i < 10; i++) { result = Html.toHtml(ed); } DebugHelper.stopMeasure("Def"); // 85 ms 

    Substitua / n => <br> <br>

    exemplo

    <p> oi </ p> <p> j </ p>

    paira:

    <p> oi </ p> <br> <br> <p> j </ p>

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.