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>

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.


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


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.


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);
    }

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.


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"

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.