Android, jak ograniczyć szerokość TextView (i dodać trzy kropki na końcu tekstu)?

317

Mam coś TextView, co chcę ograniczyć jego postacie. Właściwie mogę to zrobić, ale szukam tego, jak dodać trzy kropki (...) na końcu łańcucha. Ten pokazuje, że tekst jest kontynuowany. To jest mój XML, ale nie ma kropek, chociaż ogranicza mój tekst.

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

Odpowiedzi:

690

Przestarzałe:

Dodaj jeszcze jedną właściwość android:singleLine="true"do widoku tekstu

Zaktualizowano:

android:ellipsize="end" 
android:maxLines="1"
Mohammed Azharuddin Shaikh
źródło
3
Zdecydowanie potrzebuję singleLine, kiedy próbowałem tego. Mimo że jest przestarzałe.
EGHDK,
41
android: singleLine = „true” jest przestarzałe i ma złe skutki uboczne. zamiast tego użyj Androida: ellipsize = "end" i maxLine = "1"
Hamidreza Hosseinkhani
1
Jakie są „złe skutki uboczne” używania singleLine? Zobacz także: Czy atrybut xml singleLine jest przestarzały, czy nie w systemie Android?
Suragch
1
btw, android: maxLines może być większy niż 1, jeśli chcesz :)
Touré Holder
1
Czy ktoś ma ten komunikat „W / StaticLayout: maxLineHeight nie powinien wynosić -1. MaxLines: 1 lineCount: 1”>?
COLD ICE
157

Oto, czego się nauczyłem, grając z różnymi opcjami wymuszania TextViewna jednej linii (z trzema kropkami i bez nich).

wprowadź opis zdjęcia tutaj

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

To tylko zmusza tekst do jednej linii. Każdy dodatkowy tekst jest ukryty.

Związane z:

ellipsize = "end"

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

To odcina tekst, który nie pasuje, ale informuje użytkowników, że tekst został obcięty przez dodanie wielokropka (trzy kropki).

Związane z:

ellipsize = "markiza"

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

To powoduje, że tekst przewija się automatycznie po TextView. Zauważ, że czasami trzeba to ustawić w kodzie:

textView.setSelected(true);

Podobno android:maxLines="1"i android:singleLine="true"powinien zrobić w zasadzie to samo, a ponieważ singleLine jest najwyraźniej przestarzałe , wolałbym go nie używać, ale kiedy go wyjmuję, markiza nie przewija się. Biorąc maxLinessię nie ma wpływu to, choć.

Związane z:

HorizontalScrollView z przewijaniem Poziomo

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

Umożliwia to użytkownikowi ręczne przewijanie w celu wyświetlenia całej linii tekstu.

Suragch
źródło
Ale to tylko elipsyzacja na końcu każdego słowa. Czy jest jakiś sposób na dodanie ... w środku bardzo_długiego słowa-słowa bez białej przestrzeni ...?
Tobias Reich,
@TobiasReich, nie jestem świadomy wbudowanego sposobu, aby to osiągnąć. Możesz stworzyć swój własny za pomocą Paint.measureText .
Suragch,
Czasami może być potrzebna aplikacja: layout_constrainedWidth = "true" również
Dan Crisan
80

Wypróbuj tę właściwość TextView w pliku układu.

android:ellipsize="end"
android:maxLines="1"
Niranj Patel
źródło
31

Rozumiem, że chcesz ograniczyć szerokość do jednej linii, a nie ograniczać ją przez znak? Ponieważ singleLinejest przestarzałe, możesz spróbować użyć następujących czynności razem:

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
Muz
źródło
13

na przykład. możesz użyć

android:maxLength="13"

ograniczy to długość tekstu do 13, ale problem polega na tym, że jeśli spróbujesz dodać 3 kropki (...), nie wyświetli się, ponieważ będzie to część długości widoku tekstu.

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

     } else {

            userName = data;

    }
        textView.setText(userName);

oprócz tego musisz użyć

 android:maxLines="1"
Nayanesh Gupte
źródło
2
Lepiej użyj „\ u2026” zamiast „...”
Zharro
to był tylko przykład. jeśli umieszczam ciągi w Strings.xml, to zdecydowanie wybieram Unicode. Czy jest jakiś konkretny powód, który chcesz tu podać?
Nayanesh Gupte
2
Nie. Ostatnio osobiście dowiedziałem się o istnieniu tej postaci w Unicode i postanowiłem podzielić się tą wiedzą;)
Zharro
6

Posługiwać się

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

Tak wygląda mój pełny TextViewwygląd:

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

Obraz <code> TextView </code>

kyrylo_23
źródło
5

Korzystam z Horizonal Recyclerview.
1) W CardView TextView ulega zniekształceniu w pionie podczas używania

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

Sprawdź pogrubioną czcionkę TextViews Wyman Group, Jaskolski ... wprowadź opis zdjęcia tutaj

2) Ale kiedy użyłem singleLine wraz z elipssize -

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

Sprawdź pogrubioną czcionkę TextViews Wyman Group, Jaskolski ... wprowadź opis zdjęcia tutaj

Drugie rozwiązanie działało dla mnie poprawnie (przy użyciu singleLine). Testowałem również w wersji OS: 4.1 i nowszych (do 8.0), działa dobrze bez żadnych awarii.

Varad Mondkar
źródło
4

kod:

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

xml:

android:maxLines = "5"

na przykład

W Ewangelii Mateusza 13 uczniowie zapytali Jezusa, dlaczego przemawiał do tłumów w przypowieściach. Odpowiedział: „Dano wam poznać tajemnice królestwa niebieskiego, ale im nie zostało dane.

Wyjście: w Ewangelii Mateusza 13 uczniowie zapytali Jezusa, dlaczego rozmawiał z tłumem w przypowieściach. Odpowiedział: „Dano wam znać ...

ruin3936
źródło
4

Uzyskałem pożądany efekt za pomocą

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

Trik jest ustawiony na maxLines i minLines na tę samą wartość ... i nie tylko Android: linie = „2”, nie dawaj sztuczki. Również unikasz przestarzałych atrybutów.

użytkownik1974433
źródło
4

Musisz dodać następujące wiersze do swojego układu dla widoku tekstu

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

Mam nadzieję, że to Ci odpowiada.

Mayank Bhatnagar
źródło
3

Możesz ograniczyć liczbę znaków widoku tekstu i dodać (...) po tekście. Załóżmy, że musisz pokazać tylko 5 liter, a następnie musisz pokazać (...), po prostu wykonaj następujące czynności:

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

}

mały hack ^ _ ^. Chociaż nie jest to dobre rozwiązanie. Ale praca wokół, która działała dla mnie: D

EDYCJA: Dodałem czek na mniej znaków zgodnie z twoim ograniczonym numerem. postaci.

TheLittleNaruto
źródło
3

Aby pracować z android: ellipsize atrybutu, trzeba ograniczyć szerokość układu w TextView tak, że tekst jest poza zakresem z widokiem TextView.

Tak więc android: layout_width atrybut odgrywa tutaj kluczową rolę, ustaw go odpowiednio.

Jednym z przykładów może być:

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

Teraz, jeśli tekst w Androidzie: tekst = "To jest bardzo długi tekst do wyświetlenia" zniknie z TextView w Androidzie: layout_width = "120dp" , android: ellipsize = "end" obetnie tekst i umieść za nim ... (3 kropki) . tj. To jest bardzo długie ... zostanie wyświetlone w TextView.

Androwed
źródło
2

Myślę, że podajesz stałą wysokość i szerokość widoku tekstu. Twoje rozwiązanie zadziała.

Vinay Kumar Baghel
źródło
2

możesz napisać ten wiersz w XML, w którym weźmiesz textview:

android:singleLine="true"
Jay Thakkar
źródło
2

Podejście @AzharShaikh działa dobrze.

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

Ale zdaję sobie sprawę, że TextView zostanie obcięty przez słowo (domyślnie). Pokaż, jeśli mamy tekst taki jak:

test long_line_without_any_space_abcdefgh

TextView wyświetli:

test...

Znalazłem rozwiązanie, aby poradzić sobie z tym problemem, zastąpić spacje unikatowym znakiem spacji unicode, dzięki czemu TextView zawija się w znaki zamiast słów:

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

Wynik:

test long_line_without_any_space_abc ...

Pomyśl raz kod dwa razy
źródło
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"/>
kamran rahmatullah
źródło
1

Dodaj te dwa wiersze w tekście

android:ellipsize="end"
android:singleLine="true"
SANJAY GUPTA
źródło
0

możesz to zrobić przez xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />
Khalid Taha
źródło
Jak mogę umieścić 3 Dots@ end z maxLength="35"właściwością jakieś rozwiązanie?
Sagar
-1

Zmieniasz tylko ...

android:layout_width="wrap_content"

Użyj tego poniżej wiersza

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>
KeTaN
źródło
singleLine jest przestarzałe
Nick