Android, come limitare la larghezza di TextView (e aggiungere tre punti alla fine del testo)?


317

Ho un TextViewche voglio limitare i suoi caratteri. In realtà, posso farlo, ma la cosa che sto cercando è come aggiungere tre punti (...) alla fine della stringa. Questo mostra che il testo è continuato. Questo è il mio XML ma non ci sono punti sebbene limiti il ​​mio testo.

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

Risposte:


693

deprecato:

Aggiungi un'altra proprietà android:singleLine="true"in Textview

aggiornato:

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

3
Sicuramente ho bisogno di singleLine quando ho appena provato questo. Anche se dice deprecato.
EGHDK,

41
android: singleLine = "true" è deprecato e ha effetti collaterali negativi. usa android: ellipsize = "end" e maxLine = "1" invece
Hamidreza Hosseinkhani il

1
Quali sono i "cattivi effetti collaterali" dell'utilizzo singleLine? Vedi anche: l'attributo xml singleLine è deprecato o no in Android?
Suragch,

1
btw, android: maxLines può essere maggiore di 1 se vuoi :)
Titolare Touré

1
Qualcuno ha ricevuto questo messaggio "W / StaticLayout: maxLineHeight non dovrebbe essere -1. MaxLines: 1 lineCount: 1">?
GHIACCIO FREDDO

157

Quello che segue è ciò che ho imparato giocando con varie opzioni per forzare TextViewa una riga (con e senza i tre punti).

inserisci qui la descrizione dell'immagine

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

Questo forza solo il testo su una riga. Qualsiasi testo aggiuntivo è nascosto.

Relazionato:

ellipsize = "fine"

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

Questo taglia il testo che non si adatta ma fa sapere agli utenti che il testo è stato troncato aggiungendo dei puntini di sospensione (i tre punti).

Relazionato:

ellipsize = "tendone"

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

In questo modo il testo scorre automaticamente attraverso TextView. Si noti che a volte deve essere impostato nel codice:

textView.setSelected(true);

Presumibilmente android:maxLines="1"e android:singleLine="true"dovrebbe fare sostanzialmente la stessa cosa e poiché apparentemente è deprecato singleLine preferirei non usarlo, ma quando lo estraggo, il riquadro di selezione non scorre più. PrenderemaxLines non influisce, tuttavia.

Relazionato:

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>

Ciò consente all'utente di scorrere manualmente per visualizzare l'intera riga di testo.


Ma questo è solo ellissi alla fine di ogni parola. C'è un modo per aggiungere ... nel mezzo di uno spazio molto_lungo_senza_spazi ...?
Tobias Reich

@TobiasReich, non sono a conoscenza di un modo integrato per farlo. Puoi crearne uno tuo usando Paint.measureText .
Suragch

A volte potresti aver bisogno dell'app: layout_constrainedWidth = "true" anche
Dan Crisan

80

Prova questa proprietà di TextView nel tuo file di layout.

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

31

Presumo che tu voglia limitare la larghezza a una riga e non limitarla per carattere? Dato che singleLineè obsoleto, puoi provare a usare insieme quanto segue:

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

13

per esempio. Puoi usare

android:maxLength="13"

questo limiterà la lunghezza di texview a 13 ma il problema è se si tenta di aggiungere 3 punti (...), non lo visualizzerà, poiché farà parte della lunghezza di textview.

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

     } else {

            userName = data;

    }
        textView.setText(userName);

a parte questo devi usare

 android:maxLines="1"

2
Dovresti usare "\ u2026" invece di "..."
Zharro

questo era solo un esempio. se sto inserendo stringhe in Strings.xml allora sicuramente scelgo gli unicodes. Qualche motivo specifico che vuoi mettere qui?
Nayanesh Gupte,

2
No. Personalmente ho recentemente appreso dell'esistenza di questo personaggio
nell'Unicode

6

Uso

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

Ecco come TextViewappare il mio aspetto 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" />

Immagine di <code> TextView </code>


5

Sto usando Horizonal Recyclerview.
1) Qui in CardView, TextView viene distorto verticalmente durante l'utilizzo

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

Dai un'occhiata al grassetto TextViews Wyman Group, Jaskolski ... inserisci qui la descrizione dell'immagine

2) Ma quando ho usato singleLine insieme a ellissi -

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

Dai un'occhiata al grassetto TextViews Wyman Group, Jaskolski ... inserisci qui la descrizione dell'immagine

La seconda soluzione ha funzionato correttamente per me (usando singleLine). Inoltre ho testato nella versione del sistema operativo: 4.1 e successive (fino alla 8.0), funziona benissimo senza arresti anomali.


4

codice:

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

xml:

android:maxLines = "5"

per esempio

In Matteo 13, i discepoli chiesero a Gesù perché parlasse alla folla in parabole. Rispose: "Ti è stato dato di conoscere i misteri del regno dei cieli, ma a loro non è stato dato.

Uscita: In Matteo 13, i discepoli chiesero a Gesù perché parlasse alla folla in parabole. Rispose: "Ti è stato dato di sapere ...


4

Ho ottenuto il risultato desiderato usando

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

Il trucco è impostare maxLines e minLines sullo stesso valore ... e non solo android: lines = "2", non fare il trucco. Inoltre stai evitando qualsiasi attributo deprecato.


4

È necessario aggiungere le seguenti righe al layout per la visualizzazione di testo

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

Spero che questo funzioni per te.


3

È possibile limitare il numero di caratteri della visualizzazione di testo e aggiungere (...) dopo il testo. Supponiamo che tu abbia bisogno di mostrare solo 5 lettere e che in seguito devi mostrare (...), procedi come segue:

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 piccolo trucco ^ _ ^. Sebbene non sia una buona soluzione. Ma un lavoro attorno al quale ha funzionato per me: D

MODIFICA: Ho aggiunto il controllo per meno caratteri secondo il tuo numero limitato. di personaggi.



3

Per lavorare con l' attributo android: ellipsize , devi limitare la larghezza del layout di TextView , in modo che il testo dalla vista di TextView.

Quindi, l' attributo android: layout_width svolge qui un ruolo chiave, impostandolo di conseguenza.

Un esempio può essere:

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

Ora, qui se il testo in Android: text = "Questo è un testo molto lungo da visualizzare" non è più visibile da TextView con un androide: layout_width = "120dp" , android: ellipsize = "end" troncerà il testo e posizionare ... (3 punti) dopo di esso. cioè questo è molto lungo ... verrà visualizzato in TextView.


2

Penso che tu dia l'altezza fissa e la larghezza della vista del testo. Quindi la tua soluzione funzionerà.


2

puoi scrivere questa riga in xml dove prendi textview:

android:singleLine="true"

2

L'approccio di @AzharShaikh funziona bene.

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

Ma mi rendo conto che TextView verrà troncato a parole (per impostazione predefinita). Mostra se abbiamo un testo come:

test long_line_without_any_space_abcdefgh

TextView visualizzerà:

test...

E ho trovato una soluzione per gestire questo problema, sostituire gli spazi con il carattere unicode dello spazio senza interruzioni, che fa sì che TextView si avvolga sui caratteri anziché sulle parole:

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

Il risultato:

prova 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

Aggiungi queste due righe nel testo

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

0

puoi farlo tramite xml:

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

Come posso mettere 3 Dots@ end con maxLength="35"proprietà qualsiasi soluzione?
Sagar

-1

Devi solo cambiare ...

android:layout_width="wrap_content"

Usa questa riga sotto

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 è obsoleto
Nick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.