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

Odpowiedzi:


690

Przestarzałe:

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

Zaktualizowano:

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

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.


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"

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"

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"

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>


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.


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


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.


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.


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.



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.



2

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

android:singleLine="true"

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


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


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

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>

singleLine jest przestarzałe
Nick
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.