android textview marquee

TextView android: ellipsize="marquee" no funciona como se esperaba



(6)

Tengo algunos elementos personalizados en un ListView y cada elemento es, hasta ahora, solo un TextView en LinearLayout. Me gustaría que el texto dentro de TextView sea una sola línea que se desplaza horizontalmente cuando el texto es demasiado largo. Leí muchas publicaciones sobre esto y se me ocurrió una solución que se suponía que iba a funcionar, pero en lugar de tener que desplazar el texto completo, corté el texto a la longitud de la Vista que contenía y terminé con los tres puntos. No quiero los tres puntos, pero el texto completo debe desplazarse.

Este es el diseño de los elementos en la lista (list_item.xml)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listItem" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/list_item_selector" android:orientation="horizontal" android:paddingBottom="7dp" android:paddingLeft="15dp" android:paddingTop="7dp" > <TextView android:id="@+id/listText" style="@style/Text_View_Style_White" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="marquee" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:padding="3dp" android:selectAllOnFocus="true" android:singleLine="true" android:textColor="@drawable/list_item_text_selector" /> </LinearLayout>

Intenté también con los android:scrollHorizontally="true" android:focusable="true" , android:scrollHorizontally="true" y android:maxLines="1" pero ninguno funciona. En el método getView() del adaptador (que amplía un BaseAdapter) utilizo el setSelected(true) en el TextView, antes de devolver la Vista.

No puedo entender cuál es el problema. Cualquier ayuda será muy apreciada.


Intenta configurar tu layout_width a "match_parent". El TextView necesita un ancho específico para que funcione la elipsis y no funcionará con "wrap_content".


LinearLayout su LinearLayout o su TextView dentro de un HorizontalScrollView . Esto permitirá que el texto se muestre en su totalidad y permita desplazarse hacia la derecha y hacia la izquierda.


Tuve el mismo problema hoy y pude resolverlo. Aquí no funcionó ninguna de las soluciones enumeradas, así que pensé en compartir lo que me solucionó.

TL; DR: si configura dinámicamente el texto de TextView, intente configurar las propiedades requeridas de "marquee" en el código en lugar de hacerlo en el archivo xml del diseño.

Versión más larga: en mi caso, tenía un GridView con un adaptador y un TextView en cada artículo. Algunos de los elementos tenían texto que era demasiado largo para caber en su "celda" de la cuadrícula, y por eso quería todos los elementos que eran demasiado largos para desplazarlos varias veces. Siendo que TextView está en un GridView con un adaptador, el texto obviamente se estaba configurando en código, a partir del elemento actual del adaptador.

A través de depuraciones muy dolorosas, finalmente tuve la idea de establecer todas las configuraciones de marquesina en código en lugar de en el archivo xml de diseño. Esto causó que los 3 puntos (...) finalmente se alejaran del TextView y comenzaran a desplazarse.

Así es como se ve mi archivo de diseño ahora: (tenga en cuenta que ninguna de las propiedades enumeradas anteriormente se establece aquí)

<TextView android:text="Placeholder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:id="@+id/name" />

Y así es como se ve mi código de adaptador:

nameView.setText(name); nameView.setEllipsize(TextUtils.TruncateAt.MARQUEE); nameView.setSingleLine(true); nameView.setMarqueeRepeatLimit(5); nameView.setSelected(true);


La clave está aquí para hacer setSelected(true); en la vista de texto ... por supuesto

android:ellipsize="marquee" android:scrollHorizontally="true"

necesita ser configurado en xml también. Sin todo esto, la marquesina no sucederá. Nunca.


Como señaló @iDroid Explorer, publicar y aceptar la respuesta puede ser de ayuda para otra persona. Adaptación de mi respuesta al comentario de Tom:

Encontré la solución a mi problema. Después de algunos intentos, me di cuenta de que el problema era la línea android: selectAllOnFocus = "true" (Read @ Tom''s explanation for probabale reason). Acabo de eliminar esa línea y ahora todo está funcionando muy bien, el texto está completo y se desplaza como se desea cuando es demasiado largo para la vista contenedora.


Estaba enfrentando el mismo problema con mi textView Now got reason por lo que se muestra ... al final del texto.!

<TextView android:id="@+id/MarqueeText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="2dp" android:ellipsize="marquee" android:singleLine="true" android:maxLines="1" android:textColor="@color/text_gray" android:textSize="14sp" android:text="START | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | END" />

y después de la inicialización en mi actividad

MarqueeText.setSelected(true);

Encontré la solución a mi problema. Después de algunos intentos, me di cuenta de que el problema era el android:textIsSelectable="true" . Acabo de eliminar esa línea y ahora todo está funcionando muy bien, el texto está completo y se desplaza como se desea cuando es demasiado largo para la vista contenedora.