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"/>

Respuestas:


693

Obsoleto:

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

Actualizado:

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

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.


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"

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"

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"

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>


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.


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 ...


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.


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.


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.



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.



2

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

android:singleLine="true"

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 ...


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"/>

1

Agregue estas dos líneas en su texto

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

0

puedes hacer eso al xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />

¿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>

singleLine está en desuso
Nick
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.