Ellipsize no funciona para textView dentro de listView personalizado
Pregunta
Tengo un listView con objetos personalizados definidos por el diseño xml a continuación. Quiero el textView con id " info " para ser elipsis en una sola línea, y he intentado usar los atributos
android:singleLine="true"
android:ellipsize="end"
sin éxito.
Si configuro el layout_width en un ancho fijo como, por ejemplo,
android:layout_width="100px"
el texto está bien truncado. Pero por razones de portabilidad, esta no es una solución aceptable.
¿Puedes detectar el problema?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="5px"
>
<TextView
android:id="@+id/destination"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="22dp"
android:paddingLeft="5px"
/>
<TextView
android:id="@+id/date"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15dp"
android:paddingLeft="5px"
/>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/info_table"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px"
>
<TableRow>
<TextView
android:id="@+id/driver_label"
android:gravity="right"
android:paddingRight="5px"
android:text="@string/driver_label" />
<TextView
android:id="@+id/driver" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/passenger_label"
android:gravity="right"
android:paddingRight="5px"
android:text="@string/passenger_label" />
<TextView
android:id="@+id/passengers" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/info_label"
android:gravity="right"
android:paddingRight="5px"
android:text="@string/info_label"/>
<TextView
android:id="@+id/info"
android:layout_width="fill_parent"
android:singleLine="true"
android:ellipsize="end" />
</TableRow>
</TableLayout>
Solución
Ellipsize está roto (vaya vote sobre el informe de error , especialmente porque afirman que no es reproducible), por lo que debe usar un truco menor. Uso:
android:inputType="text"
android:maxLines="1"
en cualquier cosa que quieras elipsar. Además, no use singleLine
, ha quedado en desuso.
UPDATE:
En una inspección más cercana, el problema que tiene es que su mesa se extiende desde el lado derecho de la pantalla. Cambiar la definición de TableLayout
a:
<TableLayout
android:id="@+id/info_table"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px"
android:shrinkColumns="1">
debería solucionar ese problema, luego haga lo que dije anteriormente para elipsis de su TextView
.
Otros consejos
Sin usar propiedades en desuso, las siguientes líneas funcionan muy bien para mí
android:ellipsize="end"
android:lines="1"
android:scrollHorizontally="true"
ref http://code.google.com/p / android / issues / detail? id = 882 # c9
Tuve los mismos resultados que Steve:
android: ellipsize = " marquee " android: scrollHorizontally = " verdadero " android: líneas = " 1 "
funciona perfectamente
prueba ...
es decir
android:ellipsize="marquee"
android:focusable="true" android:marqueeRepeatLimit="num|marquee_forever"
android:lines="1" android:focusableInTouchMode="true"
android:scrollHorizontally="true"
ya que la marquesina solo funciona cuando la vista está seleccionada o enfocada de acuerdo con el comentario # 2 en http://code.google.com/p/android/issues/detail?id=5364
Después de revisar estos 3 problemas (cerrado y reabierto) y publicaciones anteriores, creo que la clave es concluir TextView con un LinearLayout externo (o cualquier otro diseño que esté usando) y establecer el " < strong> layout_width " de ancho de diseño externo un poco MÁS PEQUEÑO que la longitud del texto contenido en TextView. Parece que tiene que LIMITAR el ancho para hacer que " android: ellipsize " comportarse correctamente.
Siga la sugerencia en este problema , después de agregar todos estos atributos para hackear, también configuré el layout_width de LinearLayout externo a 240dp, por ejemplo:
<Linearlayout
android:layout_width="240dp"
android:layout_height="wrap_content"
...>
<TextView
....
android:singleLine="true"
android:lines="1"
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
android:text="this is a text which length should be longer than 240dp"
/>
</LinearLayout>
¡Entonces puedo hacer que el final de TextView muestre " ... " ;, no es muy aceptable pero funciona! Y creo que funciona si se usa en TextView normal o TextView en un Adaptador de lista.
¡Aquí está mi captura de pantalla para el resultado!
Ref. de esos 3 problemas:
Encontré en alguna parte estos atributos
<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />
funciona bien para mí (Android 1.5)
Para mí, este atributo funcionó. Probé en API 8 y en adelante
En XML
<TextView
....
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
....
/>
Programáticamente
setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
Si coloca TextView dentro de un ViewGroup personalizado que creó, asegúrese de medirlo nuevamente si cambió la dimensión después de la medición.
Por ejemplo, calculé la nueva dimensión en onLayout. Antes de llamar a child.layout, llame al
measureChild(child,
View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
Tuve el mismo problema en la tarjeta de vista del reciclador. He resuelto esto agregando el siguiente código:
<TextView
android:ellipsize="end"
android:maxLines="1"/>