Comment puis-je afficher des ellipses sur mon TextView s'il est supérieur à la ligne 1?

100

J'ai la mise en page suivante qui ne fonctionne pas:

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:id="@+id/experienceLayout" 
    android:background="#ffffff" 
    android:layout_height="match_parent" 
    android:paddingLeft="6dp" 
    android:paddingRight="6dp" 
    android:paddingBottom="6dp" 
    android:paddingTop="6dp">

    <TextView 
        android:layout_weight="1" 
        android:id="@+id/experienceLabel" 
        android:text="Experience" 
        android:layout_height="wrap_content" 
        android:textColor="#000000" 
        android:layout_width="wrap_content" 
        android:textStyle="bold">
    </TextView>

    <TextView 
        android:id="@+id/experienceTextView" 
        android:text="TextView" 
        android:layout_height="wrap_content" 
        android:textColor="#000000" 
        android:layout_width="wrap_content" 
        android:ellipsize="end" 
        android:lines="1" 
        android:maxLines="1" 
        android:singleLine="true" 
        android:fadeScrollbars="false">
    </TextView>

</LinearLayout>
Sheehan Alam
la source

Réponses:

286

C'est un problème commun. Essayez d'utiliser ce qui suit:

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

.............. le scrollHorizontally est la "sauce spéciale" qui le fait fonctionner.

BonanzaDriver
la source
12
Etrange ... J'ai essayé android:scrollHorizontally="true"mais ça n'a pas marché, j'ai dû utiliser l'attribut obsolète android:singleLine="true".
Gerardo Contijoch
1
oui scrollHorizontallyest la clé réelle de...
Rishabh Dutt Sharma
scrollHorizontally? évidemment je ne veux pas d'effet de défilement horizontal.
filthy_wizard
@ user1232726: Oui, "faire défiler horizontalement". Par bon sens, jetez un œil à la date de la question et à la date des réponses ... il va sans dire que ni l'une ni l'autre ne sont actuellement pertinentes (avant de commenter).
BonanzaDriver
L'utilisation d'ellipsize avec maxLines pourrait planter l'application - Rapport d'Android Studio intellisense
Vaishnav Mhetre
34

Cela fera également une seule ligne avec des ellipses

 android:singleLine="true"
Atul Bhardwaj
la source
15
Ceci est apparemment obsolète
Oliver Pearmain
1
Celui-ci rompt mieux les mots longs.
bpiec
android: maxLines = "1"
Jaydev
1
@grebulon Il est obsolète. Au moins maintenant.
Spikatrix
25

Utilisez ceci

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

Ne l'utilisez pas sans être pleinement conscient de la sortie

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

Lorsque vous l'utilisez, maxlines = 1il tronquera un certain temps la plupart des caractères.

Mohamed Ibrahim
la source
12

La façon dont cela fonctionnait pour moi sur plusieurs appareils / API était programmatiquement comme ceci (où tv est votre TextView):

    if (tv.getLineCount() > 1) {
        int lineEndIndex = tv.getLayout().getLineEnd(0);
        String text = tv.getText().subSequence(0, lineEndIndex - 3) + "\u2026";
        tv.setText(text);
    }
Marilia
la source
2
C'est la réponse la plus utile de toutes ... fonctionne sur chaque API et peut être facilement convertie en bibliothèque Utils.
Mariano Zorrilla du
1
Vous devriez utiliser le caractère points de suspension \u2026au lieu des trois .caractères
Chris Stillwell
Vous avez raison @ChrisStillwell et j'utilise le caractère points de suspension dans mon code. J'ai édité la réponse, merci. :)
Marilia
3

Ainsi, toutes les réponses ci-dessus répondent à l'exigence selon laquelle une seule ligne, puis les points de suspension doivent apparaître. Cependant, si vous souhaitez que les points de suspension apparaissent après certaines lignes de texte, vous devez utiliser ce qui suit:

android:ellipsize="end"
android:maxLines="2"
android:singleLine="false"

Avec cela, les points de suspension n'apparaîtront qu'après 2 lignes. Remarque: il est important que singleLine soit false.

SDK4551
la source
La valeur par défaut est false selon la documentation: developer.android.com/reference/android/widget/…
Pierre
-1

android:singleLineest obsolète. Dans mon cas, j'ai dû obtenir une hauteur fixe pour le TextViewet j'ai utilisé l' android:linesattribut à la place de android:maxLines. J'ai pensé que cela pourrait aider quelqu'un ayant le même problème que le mien.

android:ellipsize="end"
android:lines="2"
Reaz Murshed
la source
Pas vrai. La documentation ne dit rien sur la dépréciation: developer.android.com/reference/android/widget/…
cesards
@cesards Intéressant. Ce document dit que c'est - developer.android.com/reference/android/R.attr.html#singleLine
Reaz Murshed