Jak mogę wyświetlić wielokropki na moim TextView, jeśli jest większy niż 1 wiersz?

100

Mam następujący układ, który nie działa:

<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
źródło

Odpowiedzi:

286

To częsty problem. Spróbuj użyć następującego:

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

.............. zwój Horyzontalnie to „specjalny sos”, który sprawia, że ​​działa.

BonanzaDriver
źródło
12
Dziwne ... Próbowałem, android:scrollHorizontally="true"ale to nie zadziałało, musiałem użyć przestarzałego atrybutu android:singleLine="true".
Gerardo Contijoch
1
tak scrollHorizontallyjest kluczem do...
Rishabh Dutt Sharma
scrollHorizontally? oczywiście nie chcę efektu przewijania w poziomie.
filthy_wizard,
@ user1232726: Tak, „przewiń w poziomie”. Kierując się zdrowym rozsądkiem, spójrz na datę pytania i datę odpowiedzi ... jest oczywiste, że żadne z nich nie może być obecnie powiązane (przed komentarzem).
BonanzaDriver
Używanie elipsize z maxLines może spowodować awarię aplikacji - Raport z Android Studio intellisense
Vaishnav Mhetre
34

Spowoduje to również utworzenie pojedynczej linii z elipsą

 android:singleLine="true"
Atul Bhardwaj
źródło
15
Najwyraźniej jest to przestarzałe
Oliver Pearmain
1
Ten lepiej łamie długie słowa.
bpiec
android: maxLines = "1"
Jaydev
1
@grebulon To jest przestarzałe. Przynajmniej teraz.
Spikatrix
25

Użyj tego

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

Nie używaj tego bez pełnej świadomości, jakie dane wynikowe

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

Kiedy maxlines = 1go użyjesz , przez jakiś czas obcina większość znaków.

Mohamed Ibrahim
źródło
12

Sposób, w jaki to działało na wielu urządzeniach / interfejsach API, był programistycznie taki (gdzie tv to Twój TextView):

    if (tv.getLineCount() > 1) {
        int lineEndIndex = tv.getLayout().getLineEnd(0);
        String text = tv.getText().subSequence(0, lineEndIndex - 3) + "\u2026";
        tv.setText(text);
    }
Marilia
źródło
2
To najbardziej pomocna odpowiedź ze wszystkich ... działa na każdym API i można ją łatwo przekonwertować na bibliotekę Utils.
Mariano Zorrilla
1
Powinieneś użyć znaku wielokropka \u2026zamiast trzech .znaków
Chris Stillwell
Masz rację @ChrisStillwell i używam znaku wielokropka w moim kodzie. Zredagowałem odpowiedź, dziękuję. :)
Marilia,
3

Zatem wszystkie powyższe odpowiedzi są zgodne z wymogiem, aby pojawił się tylko 1 wiersz, a następnie wielokropek. Jeśli jednak chcesz, aby wielokropek pojawiał się po pewnych wierszach tekstu, powinieneś użyć następującego:

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

Dzięki temu wielokropek pojawi się dopiero po 2 liniach. Uwaga: ważne jest, aby wartość singleLine była fałszywa.

SDK4551
źródło
Wartość domyślna to false zgodnie z dokumentacją: developer.android.com/reference/android/widget/…
Pierre
-1

android:singleLinejest przestarzałe. W moim przypadku musiałem uzyskać stałą wysokość dla TextViewi użyłem android:linesatrybutu zamiast android:maxLines. Pomyślałem, że to może pomóc komuś, kto ma taki sam problem jak mój.

android:ellipsize="end"
android:lines="2"
Reaz Murshed
źródło
Nie prawda. Dokumentacja nie mówi nic o wycofaniu: developer.android.com/reference/android/widget/ ...
cesards
@cesards Ciekawe. Ten dokument mówi, że tak jest - developer.android.com/reference/android/R.attr.html#singleLine
Reaz Murshed