Truncar automáticamente el texto de TextView para no superponer otro TextView

Tengo un ListView que muestra un montón de tareas asignadas. Él ListView artículos utilizan un FrameLayout para posicionar dos TextViews. La primera TextView está alineado a la izquierda, y el segundo está alineado a la derecha. (Ambos están alineados en el centro verticalmente). El primero muestra un fragmento de la descripción de la tarea y el segundo muestra la fecha de vencimiento.

Lo que quiero hacer es que la fecha de vencimiento ocupe todo el espacio que necesita y la descripción llene el espacio restante, así:

|----------------------------------------------------------------- ---|
| Lea las páginas 15-35, actualice el tiempo... Vie, 4 de mayo|
|----------------------------------------------------------------- ---|

En este momento, el texto de la descripción continuará superponiéndose a la fecha. Sin embargo, se truncará al final de la línea.

¿Hay alguna forma de que pueda hacer esto en XML, o tengo que hacerlo en código acortando la cadena antes de configurar el TextView valor (presumiblemente en mi getView llamar)? Si lo hiciera en código, tendría que calcular la cantidad de espacio horizontal que ocuparían las cadenas para determinar qué tan corta debe ser la descripción. Eso parece que podría ensuciarse...

¡Cualquier otra sugerencia sobre cómo lograr esto es muy apreciada!

preguntado el 03 de mayo de 12 a las 21:05

4 Respuestas

Intente usar el atributo de elipse como:

<TextView android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:ellipsize="end"
      android:singleLine="true"/>

Tenga en cuenta que Android, o al menos algunas versiones, requieren los atributos "ellipsize" y "singleline" para que el sistema realmente haga el truncamiento y agregue los puntos suspensivos.

respondido 08 nov., 14:17

Esto es lo que funcionó para mí. Realmente no funcionó como se pretendía hasta que especifiqué el singleLine atributo - damachk

En lugar de FrameLayout, este es el lugar perfecto para LinearLayout o RelativeLayout en combinación con ellipsize:

<LinearLayout
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >

  <TextView
    ...
    android:width="0dp"
    android:height="wrap_content"
    android:layout_weight="1" 
    android:ellipsize="end" />

  <TextView
    ...
    android:width="wrap_content"
    android:height="wrap_content"
    android:layout_weight="0" />

</LinearLayout>

O alternativamente

<RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >

  <TextView
    ...
    android:id="@+id/secondTV"
    android:width="wrap_content"
    android:height="wrap_content"
    android:layout_weight="0" />

  <TextView
    ...
    android:width="0dp"
    android:height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@id/secondTV" 
    android:ellipsize="end"/>

</RelativeLayout>

contestado el 03 de mayo de 12 a las 22:05

¡La opción RelativeLayout lo hizo por mí! (FYI: layout_weight solo se aplica a LinearLayouts) - poderoso

Cambie FrameLayout a LinearLayout o RelativeLayout.

  • LinearLayout: haga que el ancho de la fecha de vencimiento sea "wrap_content" y el ancho de la descripción sea 0dp, luego agregue layout_weight="1" a la descripción

  • RelativeLayout: Diseñe la fecha de vencimiento primero con el ancho wrap_content, luego el diseño de la descripción con una regla que debe estar a la izquierda de la fecha de vencimiento.

contestado el 03 de mayo de 12 a las 21:05

Tanto Anton como JRaymond estaban bastante enfocados (JRaymond me ayudó a resolverlo con su ejemplo). Esto es lo que se me ocurrió:

<RelativeLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView android:id="@+id/due_date"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:singleLine="true" />

        <TextView android:id="@+id/description"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:layout_toLeftOf="@id/due_date"
            android:singleLine="true" />
</RelativeLayout>

(Primero necesitaba declarar mi etiqueta de fecha de vencimiento para poder hacer referencia a ella en la descripción. También me acabo de dar cuenta de que android: ellipsize parece ser opcional; supongo que por defecto es "fin").

¡Gracias un montón!

Respondido 13 Oct 12, 22:10

Ah, lo arreglé: necesitaba configurar layout_width="0dp" en la Descripción TextView. (Sí, ahora me doy cuenta de que eso es lo que JRaymond dijo que hiciera...) No estoy seguro de por qué funcionó antes... - poderoso

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.