Extra padding en TextView con contenido HTML

Tengo este TextView :

 <TextView android:id="@+id/issue_journal_item_notes" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/issue_journal_item_details" android:layout_below="@+id/issue_journal_item_details" android:background="@drawable/journal_item_notes_background" android:padding="8dp" android:text="issue_journal_item_notes" android:textIsSelectable="true" /> 

Estoy llenando esto con:

 String html = "<p>Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.android.com/sdk/index.html<br/>(needed for logcat)</p>"; theTextView.setText(Html.fromHtml(html)); 

Esto resulta en:

Captura de pantalla resultante

"Assignee …" es otro TextView .
Mi TextView es el que tiene el fondo gris. Sus límites se ven claramente con el gris muy claro. La barra gris oscura más izquierda a la izquierda es parte del fondo, por lo que también es el TextView

Podemos ver claramente el relleno cuadrado 8dp. Sin embargo, ¿cuál es el espacio vacío en la parte inferior? Es un tipo de relleno, pero no lo he establecido en XML ni en código!

En caso de que alguien pida, necesito soporte HTML, porque a diferencia de la captura de pantalla mostrada arriba, el contenido puede tener algún contenido HTML ( <pre> , <i> , <b> , etc.).

El "relleno" extra que está viendo, es de hecho sólo un salto de línea seguido de otra ruptura de línea:

Introduzca aquí la descripción de la imagen

Cuando se Html.fromHtml(...) en la Html.fromHtml(...) , se encontrará con el siguiente método que maneja las etiquetas de párrafo:

 private static void handleP(SpannableStringBuilder text) { int len = text.length(); if (len >= 1 && text.charAt(len - 1) == '\n') { if (len >= 2 && text.charAt(len - 2) == '\n') { return; } text.append("\n"); return; } if (len != 0) { text.append("\n\n"); } } 

El snippet anterior se tomó de la fuente de Android 4.2.2 . La lógica es bastante sencilla y básicamente asegura que cada etiqueta de párrafo termina con \n\n , para dar una brecha visual entre dos bloques de elementos. Significa que el marco no tendrá en cuenta si todo el texto Html consta de un solo párrafo (su caso), o múltiples, paragap sucesivos – siempre habrá dos saltos de línea al final de un párrafo transformado.

Dicho esto, si sabes que siempre estás tratando con un solo párrafo, la solución más fácil es quitar ese párrafo de envoltura antes de alimentarlo a Html.fromHtml(...) . Esto es más o menos lo que se propuso en una de las otras respuestas.

Ahora, ya que mencionó esto no es realmente una opción, la alternativa sería "recortar" el resultado de Html.fromHtml(...) , eliminando cualquier espacio en blanco. Android devuelve un Spanned (normalmente este es un objeto SpannableStringBuilder ), que, por desgracia, no viene con un método built-in trim() . No es demasiado complicado para llegar a su propia aunque, o pedir prestado uno de varios implementaciones disponibles por ahí.

Una implementación básica para un método trim() sería algo así:

 public static CharSequence trim(CharSequence s, int start, int end) { while (start < end && Character.isWhitespace(s.charAt(start))) { start++; } while (end > start && Character.isWhitespace(s.charAt(end - 1))) { end--; } return s.subSequence(start, end); } 

Para usarlo, cambie su código original a:

 String html = "<p>Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.android.com/sdk/index.html<br/>(needed for logcat)</p>"; CharSequence trimmed = trim(Html.fromHtml(html)); theTextView.setText(trimmed); 

Y voilà, antes y después:

Introduzca aquí la descripción de la imagen

También puede usar el código abajo

  myTextView.setText(noTrailingwhiteLines(html)); private CharSequence noTrailingwhiteLines(CharSequence text) { while (text.charAt(text.length() - 1) == '\n') { text = text.subSequence(0, text.length() - 1); } return text; } 

Html.fromHtml(html) devuelve Spannable para que pueda convertirlo en string llamando a String toString() luego trim la cadena y luego ponerla en textview

 String html = "<p>Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.android.com/sdk/index.html<br/>(needed for logcat)</p>"; theTextView.setText(Html.fromHtml(html).toString().trim()); 

¿Cuál es el diseño de tu TextView? Lo que recuerdo es que algunos diseños ignoran la preferencia de altura de su componente y simplemente lo hacen encajar.

Pruebe esto, quitando la etiqueta <p> .

 String html = "Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.android.com/sdk/index.html<br/>(needed for logcat)"; theTextView.setText(Html.fromHtml(html)); 

Espero que funcione.

  • Agregar color "# e3bb87" a StateListDrawable mediante programación
  • Error al inflar la clase <unknown>
  • Mostrar todos los caracteres Unicode en TextView
  • ¿Cómo pasar el evento onClick a su padre en Android?
  • Ellipsize sólo una sección en un TextView
  • Android setMovementMethod en un TextView dentro de un ListView
  • Esquina redondeada para texto en android
  • Desplazamiento horizontal automático de Android TextView
  • Prensa larga sobre el texto seleccionado en textview en android
  • Agregar una etiqueta dentro de un TextView en android
  • Comportamiento impar: Tipo de clase del objeto devuelto por el método getText () de cambios TextView después de crear AccessibilityNodeInfo de TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.