Android, ¿Cómo limitar el ancho de TextView (y agregar tres puntos al final del texto)?

317

Tengo una TextViewque quiero limitar los personajes de la misma. En realidad, puedo hacer esto, pero lo que estoy buscando es cómo agregar tres puntos (...) al final de la cadena. Este muestra que el texto ha continuado. Este es mi XML pero no hay puntos, aunque limita mi texto.

<TextView 
        android:id                      = "@+id/tvFixture"
        android:layout_width            = "wrap_content"
        android:layout_height           = "wrap_content"
        android:layout_toLeftOf         = "@id/ivFixture_Guest"
        android:text                    = "@string/test_06"
        android:lines                   = "1"
        android:ems                     = "3"
        android:gravity                 = "right"
        style                           = "@style/simpletopic.black" 
        android:ellipsize="end"/>
Hesam
fuente

Respuestas:

693

Obsoleto:

Agregue una propiedad más android:singleLine="true"en su Textview

Actualizado:

android:ellipsize="end" 
android:maxLines="1"
Mohammed Azharuddin Shaikh
fuente
3
Definitivamente necesito singleLine cuando acabo de intentar esto. A pesar de que dice obsoleto.
EGHDK
41
android: singleLine = "true" está en desuso y tiene efectos secundarios negativos. use android: ellipsize = "end" y maxLine = "1" en su lugar
Hamidreza Hosseinkhani
1
¿Cuáles son los "efectos secundarios negativos" del uso singleLine? Consulte también: ¿El atributo xml singleLine está en desuso o no está en Android?
Suragch
1
por cierto, android: maxLines puede ser mayor que 1 si lo desea :)
Touré Holder
1
¿Alguien tiene este mensaje "W / StaticLayout: maxLineHeight no debería ser -1. MaxLines: 1 lineCount: 1">?
HIELO FRÍO
157

Lo siguiente es lo que aprendí jugando con varias opciones para forzar TextViewa una sola línea (con y sin los tres puntos).

ingrese la descripción de la imagen aquí

android: maxLines = "1"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="one two three four five six seven eight nine ten" />

Esto simplemente fuerza el texto a una línea. Cualquier texto adicional está oculto.

Relacionado:

ellipsize = "fin"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:ellipsize="end"
    android:text="one two three four five six seven eight nine ten" />

Esto corta el texto que no se ajusta, pero les permite a los usuarios saber que el texto se ha truncado al agregar puntos suspensivos (los tres puntos).

Relacionado:

ellipsize = "marquesina"

<TextView
    android:id="@+id/MarqueeText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="one two three four five six seven eight nine ten" />

Esto hace que el texto se desplace automáticamente por TextView. Tenga en cuenta que a veces debe establecerse en el código:

textView.setSelected(true);

Supuestamente android:maxLines="1"y android:singleLine="true"debería hacer básicamente lo mismo y dado que singleLine aparentemente está en desuso , preferiría no usarlo, pero cuando lo saco, la marquesina ya no se desplaza. Sin maxLinesembargo, sacar no lo afecta.

Relacionado:

HorizontalScrollView con scrollHorizontally

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/horizontalScrollView">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:scrollHorizontally="true"
        android:text="one two three four five six seven eight nine ten" />
</HorizontalScrollView>

Esto permite al usuario desplazarse manualmente para ver toda la línea de texto.

Suragch
fuente
Pero esto es solo elipsis al final de cada palabra. ¿Hay alguna forma de agregar ... en medio de una palabra muy larga sin espacio en blanco ...?
Tobias Reich
@TobiasReich, no conozco una forma integrada de lograr eso. Puedes hacer el tuyo usando Paint.measureText .
Suragch
A veces puede necesitar la aplicación: layout_constrainedWidth = "true" también
Dan Crisan
80

Pruebe esta propiedad de TextView en su archivo de diseño.

android:ellipsize="end"
android:maxLines="1"
Niranj Patel
fuente
31

Supongo que quiere limitar el ancho a una línea y no limitarlo por carácter. Como singleLineestá en desuso, podría intentar usar lo siguiente juntos:

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
Muz
fuente
13

p.ej. puedes usar

android:maxLength="13"

esto restringirá la longitud de la vista de texto a 13, pero el problema es que si intentas agregar 3 puntos (...), no se mostrará, ya que será parte de la longitud de la vista de texto.

     String userName;
     if (data.length() >= 13) {
            userName = data.substring(0, 13)+ "...";

     } else {

            userName = data;

    }
        textView.setText(userName);

aparte de esto tienes que usar

 android:maxLines="1"
Nayanesh Gupte
fuente
2
Debería usar mejor "\ u2026" en lugar de "..."
Zharro
esto fue solo como un ejemplo. si estoy poniendo cadenas en Strings.xml, definitivamente voy por unicodes. ¿Alguna razón específica que quieras poner aquí?
Nayanesh Gupte
2
No Personalmente, recientemente supe de la existencia de este personaje en Unicode y decidí compartir este conocimiento;)
Zharro
6

Utilizar

  • android:singleLine="true"
  • android:maxLines="1"
  • app:layout_constrainedWidth="true"

Así es mi TextViewaspecto completo :

    <TextView
    android:id="@+id/message_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="5dp"
    android:maxLines="1"
    android:singleLine="true"
    android:text="NAME PLACEHOLDER MORE Text"
    android:textColor="@android:color/black"
    android:textSize="16sp"

    android:textStyle="bold"
    app:layout_constrainedWidth="true"
    app:layout_constraintEnd_toStartOf="@id/message_check_sign"
    app:layout_constraintHorizontal_bias="0"
    app:layout_constraintStart_toEndOf="@id/img_chat_contact"
    app:layout_constraintTop_toTopOf="@id/img_chat_contact" />

Imagen de <code> TextView </code>

kyrylo_23
fuente
5

Estoy usando Horizonal Recyclerview.
1) Aquí en CardView, TextView se distorsiona verticalmente cuando se usa

android:ellipsize="end"
android:maxLines="1"

Compruebe el texto audaz de Wyman Group, Jaskolski ... ingrese la descripción de la imagen aquí

2) Pero cuando usé singleLine junto con elipsis -

android:ellipsize="end"
android:singleLine="true"

Compruebe el texto audaz de Wyman Group, Jaskolski ... ingrese la descripción de la imagen aquí

La segunda solución me funcionó correctamente (usando singleLine). También he probado en la versión del sistema operativo: 4.1 y superior (hasta 8.0), funciona bien sin fallas.

Varad Mondkar
fuente
4

código:

TextView your_text_view = (TextView) findViewById(R.id.your_id_textview);
your_text_view.setEllipsize(TextUtils.TruncateAt.END);

xml:

android:maxLines = "5"

p.ej

En Mateo 13, los discípulos le preguntaron a Jesús por qué habló a las multitudes en parábolas. Él respondió: "Se te ha dado conocer los misterios del reino de los cielos, pero a ellos no se les ha dado.

Resultado: En Mateo 13, los discípulos le preguntaron a Jesús por qué habló a las multitudes en parábolas. Él respondió: "Te ha sido dado saber ...

ruina3936
fuente
4

Obtuve el resultado deseado usando

android:maxLines="2"
android:minLines="2"
android:ellipsize="end"

El truco es establecer maxLines y minLines en el mismo valor ... y no solo android: lines = "2", no hagas el truco. También estás evitando cualquier atributo en desuso.

usuario1974433
fuente
4

Debe agregar las siguientes líneas en su diseño para la vista de texto

android:maxLines="1"
android:ellipsize="end"
android:singleLine="true"

Espero que esto funcione para usted.

Mayank Bhatnagar
fuente
3

Puede limitar el número de caracteres de su vista de texto y agregar (...) después del texto. Supongamos que necesita mostrar solo 5 letras y luego debe mostrar (...), simplemente haga lo siguiente:

String YourString = "abcdefghijk";

if(YourString.length()>5){

YourString  =  YourString.substring(0,4)+"...";

your_text_view.setText(YourString);
}else{

 your_text_view.setText(YourString); //Dont do any change

}

un pequeño truco ^ _ ^. Aunque no es una buena solución. Pero un trabajo en torno al cual funcionó para mí: D

EDITAR: He agregado un cheque por menos caracteres según su número limitado. de personajes.

TheLittleNaruto
fuente
Ya se explica aquí
Sombrero de paja
3

Para trabajar con el atributo android: ellipsize , debe limitar el ancho de diseño de TextView , de modo que el texto esté fuera de los límites de la vista de TextView.

Entonces, el atributo android: layout_width juega un papel clave aquí, configúrelo en consecuencia.

Un ejemplo puede ser:

<TextView        
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:text="This is a very long text to be displayed"
    android:textSize="12sp"
    android:maxLines="1"            
     />

Ahora, aquí si el texto en android: text = "Este es un texto muy largo para mostrar" no se ve desde TextView con un android: layout_width = "120dp" , android: ellipsize = "end" truncará el texto y colocar ... (3 puntos) después de eso. es decir, esto es muy largo ... se mostrará en TextView.

Androwed
fuente
2

Creo que le das a la altura y al ancho de la vista de texto. Entonces su solución funcionará.

Vinay Kumar Baghel
fuente
2

puedes escribir esta línea en xml donde tomas textview:

android:singleLine="true"
Jay Thakkar
fuente
2

El enfoque de @AzharShaikh funciona bien.

android:ellipsize="end"
android:maxLines="1"

Pero me doy cuenta de un problema de que TextView se truncará por palabra (por defecto). Mostrar si tenemos un texto como:

prueba long_line_without_any_space_abcdefgh

TextView mostrará:

prueba...

Y encontré una solución para manejar este problema, reemplazar espacios con el carácter de espacio sin interrupción Unicode, hace que TextView ajuste los caracteres en lugar de las palabras:

yourString.replace(" ", "\u00A0");

El resultado:

prueba long_line_without_any_space_abc ...

Piensa dos veces el código una vez
fuente
2
        <TextView
            android:id="@+id/product_description"
            android:layout_width="165dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:paddingLeft="12dp"
            android:paddingRight="12dp"
            android:text="Pack of 4 summer printed pajama"
            android:textColor="#d2131c"
            android:textSize="12sp"
            android:maxLines="2"
            android:ellipsize="end"/>
kamran rahmatullah
fuente
1

Agregue estas dos líneas en su texto

android:ellipsize="end"
android:singleLine="true"
SANJAY GUPTA
fuente
0

puedes hacer eso al xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />
Khalid Taha
fuente
¿Cómo puedo poner 3 Dots@ end con maxLength="35"propiedad alguna solución?
Sagar
-1

Solo cambias ...

android:layout_width="wrap_content"

Use esto debajo de la línea

android:layout_width="match_parent"

.......

   <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:layout_marginTop="10dp"
       android:layout_toRightOf="@+id/visitBox"
       android:orientation="vertical" >

             <TextView
                  android:id="@+id/txvrequestTitle"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:singleLine="true"
                  android:text="Abcdefghighiklmnon"
                  android:textAppearance="? 
                  android:attr/textAppearanceLarge"
                  android:textColor="@color/orange_color" />

   </LinearLayout>
KeTaN
fuente
singleLine está en desuso
Nick