Detectar si TextView en ListView está ellipsizado
Tengo un adaptador personalizado que procesa algunos elementos en un ListView. Necesito mostrar un icono en los elementos de ListView, si el texto del elemento es elipsis, y ocultarlo si hay suficiente espacio para que el texto termine. Tengo acceso al botón en el método getView de mi adaptador (donde establecí el texto), pero las elipses no se agregan inmediatamente al configurar el texto.
¿Hay alguna manera de que pueda hacer esto?
- Temporizador de TextView de Android
- AppCompat v22: Establecer el color de texto predeterminado para TextView
- El desplazamiento de texto no funciona
- ¿Cómo inserto un salto de línea en una cadena para mostrarlo en un widget Android TextView?
- MotionEvent.ACTION_UP en la vista de texto
Aquí está mi marcado de TextView:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:id="@+id/list_item_description"/>
- Espaciado de párrafos con SpannableStringBuilder en TextView
- El helado de helado de elipse añade [
- Vista de texto no desplazable en android
- Nuevo carácter de línea \ n no se muestra correctamente en textView Android
- ¿Justificar texto en una aplicación de Android utilizando un WebView pero presentando una interfaz similar a TextView?
- Cómo eliminar la fila de la tabla en el diseño de la tabla en android
- ¿Cómo hacer la escritura de texto de animación?
- Cómo abreviar un TextView?
Public int getEllipsisCount (línea int) :
Devuelve el número de caracteres a elipsar, o 0 si no hay elipsis.
Por lo tanto, simplemente llame a:
if(textview1.getLayout().getEllipsisCount() > 0) { // Do anything here.. }
Puesto que no se puede llamar a getLayout () antes de que se establezca el diseño, utilice ViewTreeObserver para encontrar cuando se carga la vista de texto:
ViewTreeObserver vto = textview.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) if ( l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); } } });
Y finalmente no se olvide de quitar removeOnGlobalLayoutListener cuando lo necesite nomore.
La parte difícil es que la vista que está trabajando en getView
a veces se ha establecido, ya veces no, por lo que tiene que manejar ambos casos.
Cuando no ha sido establecido, usted fija un observador del árbol de la visión para comprobar en las elipsis una vez que ha sido. En el caso de las vistas recicladas, el diseño ya estará allí y podrá comprobar las elipsis inmediatamente después de configurar el texto.
public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder vh; if (convertView == null) { vh = new ViewHolder(); ... // create/inflate view and populate the ViewHolder } vh = (ViewHolder) convertView.getTag(); // Set the actual content of the TextView vh.textView.setText(...); // Hide the (potentially recycled) expand button until ellipsizing checked vh.expandBtn.setVisibility(GONE); Layout layout = vh.textView.getLayout(); if (layout != null) { // The TextView has already been laid out // We can check whether it's ellipsized immediately if (layout.getEllipsisCount(layout.getLineCount()-1) > 0) { // Text is ellipsized in re-used view, show 'Expand' button vh.expandBtn.setVisibility(VISIBLE); } } else { // The TextView hasn't been laid out, so we need to set an observer // The observer fires once layout's done, when we can check the ellipsizing ViewTreeObserver vto = vh.textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout layout = vh.textView.getLayout(); if (layout.getEllipsisCount(layout.getLineCount()-1) > 0) { // Text is ellipsized in newly created view, show 'Expand' button vh.expandBtn.setVisibility(VISIBLE); } // Remove the now unnecessary observer // It wouldn't fire again for reused views anyways ViewTreeObserver obs = vh.textView.getViewTreeObserver(); obs.removeGlobalOnLayoutListener(this); } }); return convertView; }
Espero que entienda su pregunta correctamente – si usted está mirando para terminar un TextView
que sea demasiado ancho para una pantalla con elipses, usted puede agregar estos atributos a su TextView
:
android:ellipsize="end" android:maxLines="1" android:scrollHorizontally="true"
Si, sin embargo, desea determinar si un TextView
se termina con una elipsis o se muestra en su totalidad, no estoy tan seguro de que es posible – no parece que sea. Sin embargo, es posible que desee probar el método getEllipsize()
de TextView
. No estoy seguro si eso devuelve el punto en donde el TextView es ellipsized por Android, o donde usted ha fijado el TextView para ser ellipsized.
Puede configurar su texto para marcar. Agregar esto en su código podría ayudar …..
android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:freezesText="true" android:marqueeRepeatLimit="marquee_forever"
También puedes poner un scrollview horizontal para tu código ….
<HorizontalScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/list_item_description" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:ellipsize="end" android:gravity="center_vertical" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> </HorizontalScrollView>
- ¿Debo cambiar el Listview existente en mi aplicación a RecyclerView?
- ¿Cómo conseguir el área total cubierta mientras que dibuja la trayectoria en el androide de la lona?