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:
- Android - epub reader para leer archivos .epub ..
- Por qué mi invocación de Canvas.drawText () simplemente no funciona
- Disposición de Android: Alinear un TextView y un Spinner
- Cómo hacer una vista de seguir a mi dedo con onScroll y GestureDetector - Android
- Cambiar el color de fondo de un TextView cuando se hace clic
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:
"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.).
- Cómo hacer que TextView se desplace en Android
- Fade out / fade en TextView basado en desplazamiento
- Cómo obtener rápidamente el ancho y la altura de TextView utilizando Paint.getTextBounds ()?
- Android - Centro de vista de texto en LinearLayout
- Textview dentro de RelativeLayout en la vista personalizada ¿No se aplica la gravedad correctamente?
- Cómo obtener las coordenadas XY y el tamaño de píxeles de un TextView?
- Androide: elipsis en el texto ICS continúa después de la elipsis
- Usando onClick en TextView con texto seleccionable - cómo evitar doble clic?
El "relleno" extra que está viendo, es de hecho sólo un salto de línea seguido de otra ruptura de línea:
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:
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.
- Android GoogleAnalytics getInstance
- ¿Cómo deshacerse del subrayado en una cadena Spannable con un objeto clicable?