2012-05-25 11 views
189

Mam TextView, który chcę ograniczyć znaki z niego. Właściwie mogę to zrobić, ale rzeczą, której szukam, jest dodanie trzech kropek (...) 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.Android, Jak ograniczyć szerokość TextView (i dodać trzy kropki na końcu tekstu)?

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

Odpowiedz

395

nieaktualne:

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

aktualizacja:

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

Zdecydowanie potrzebuję singleLine, gdy właśnie spróbowałem. Mimo że jest przestarzałe. – EGHDK

+23

android: singleLine = "true" jest przestarzałe i ma złe efekty uboczne. użyj android: ellipsize = "end" i maxLine = "1" zamiast –

+0

Jakie są "złe efekty uboczne" używania 'singleLine'? Zobacz też: [Czy atrybut xml singleLine jest nieaktualny czy nie jest w systemie Android?] (Https://stackoverflow.com/questions/30028697/is-the-xml-attribute-singleline-deprecated-lub-in-and-android) – Suragch

77

Spróbuj własność TextView w pliku layoutu ..

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

Myślę, że dajesz stałą wysokość i szerokość widoku tekstu. Wtedy twoje rozwiązanie będzie działać.

3

można napisać ten wiersz w formacie XML, w którym wziąć textview:

android:singleLine="true" 
29

biorę go chcesz ograniczyć szerokość do jednej linii, a nie ograniczać go po znaku? Od singleLine jest przestarzała, można spróbować użyć następujących razem:

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

np. można użyć

android:maxLength="13" 

będzie ograniczać długość texview do 13, ale problemem jest to, jeśli spróbujesz dodać 3 kropki (...) to przyzwyczajenie go wyświetlić, jak to będzie częścią długości TextView.

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

    } else { 

      userName = data; 

    } 
     textView.setText(userName); 

oprócz tego trzeba użyć

android:maxLines="1" 
+1

Powinieneś lepiej użyć "\ u2026" zamiast "..." – Zharro

+0

był to tylko przykład. jeśli umieszczam ciągi w Strings.xml, to zdecydowanie wybieram unicodes. Jakiś konkretny powód, który chcesz tu umieścić? –

+2

Nie. Osobiście dowiedziałem się o istnieniu tej postaci w Unicode i postanowiłem podzielić się tą wiedzą;) – Zharro

4

Kod:

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

xml:

android:maxLines = "5" 

np

W Ew. Mateusza 13 uczniowie zapytali Jezusa, dlaczego przemówił do tłumów w przypowieściach. On odpowiedział: " Dano wam poznać tajemnice królestwa niebieskiego, ale dla nich nie zostało dane.

Wyjście: W Ew. Mateusza 13 uczniowie zapytali Jezusa, dlaczego przemówił do tłumów w przypowieściach. Odpowiedział: " Zostało ci powiedziane, aby wiedzieć ...

4

Możesz ograniczyć liczbę znaków w tekście i dodać (...) po tekście. Załóżmy, że musisz pokazać tylko 5 liter, a następnie musisz pokazać (...), 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órej pracował dla mnie: D

EDIT: Dodałem czek na mniej charakterem, jak na swój ograniczony no. znaków.

+0

[To już wyjaśniono tutaj] (http://stackoverflow.com/questions/10748796/android-how-to-limit- width-of-textview-and-putting-three-dots-at-the-end-of-te/16580374 # 16580374) –

+1

@Prewniałeś lol ... trolled ten mały naruto bro ... hahahaahahahah #thuglife. .. – Learner

0

Wystarczy zmienić

androida: layout_width = "wrap_content"

używać tego poniżej linii

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

mam pożądanego rezultatu przez użycie

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

Sztuczka polega na ustawieniu maxLines i minLines na tę samą wartość ... i nie tylko na android: lines = "2", nie rób tego. Również unikasz żadnych przestarzałych atrybutów.

114

Oto, czego się nauczyłem, bawiąc się różnymi opcjami, aby zmusić TextView do pojedynczej linii (z trzema kropkami i bez nich).

enter image description here

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 właśnie zmusza tekst na jednej linii. Dowolny dodatkowy tekst jest ukryty.

pokrewne:

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

Powoduje obcięcie tekstu, który nie pasuje, ale informuje użytkowników, że tekst został obcięty poprzez dodanie wielokropka (trzy kropki).

pokrewne:

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 sprawia, że tekst przewija się automatycznie przez TextView.Zauważ, że sometimes musi być ustawiony w kodzie:

textView.setSelected(true); 

rzekomo android:maxLines="1" i android:singleLine="true" powinien zrobić w zasadzie to samo, a od SingleLine jest apparently deprecated wolałbym go nie używać, ale kiedy go wyjąć, markizę nie przewija więcej. Wyjęcie maxLines nie ma jednak na nie wpływu.

pokrewne:

HorizontalScrollView z scrollHorizontally

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

To pozwala użytkownikowi ręcznie przewijać, aby zobaczyć całą linię tekstu.

+0

Dzięki! ellipsize = "middle" to to, czego szukałem. –

+0

Ale to tylko elipsyzacja na końcu każdego słowa. Czy jest jakiś sposób dodania ... w środku bardzo_long_word_without_whitespace ...? –

+0

@TobiasReich, nie jestem świadomy wbudowanego sposobu, aby to osiągnąć. Można zrobić własne przy użyciu [Paint.measureText] (https://developer.android.com/reference/android/graphics/Paint.html#measureText (java.lang.String)). – Suragch

3

Trzeba dodać następujące linie do układu za TextView

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

nadzieję, że to działa dla Ciebie.

1

dodać te dwie linie w tekście

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

Podejście @AzharShaikh działa dobrze.

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

Ale zdaję sobie sprawę, że kłopoty TextView zostanie obcięty przez słowa (zaocznego). Pokaż jeśli mamy tekst jak:

Test long_line_without_any_space_abcdefgh

TextView wyświetli:

testu ...

I znalazłem rozwiązanie do obsługi tego problem, zamień spacje na znak bez podziału na znaki Unicode, powoduje zawijanie tekstu na znakach zamiast słów:

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

Rezultat:

Test long_line_without_any_space_abc ...

3

Aby pracować z android: ellipsize atrybut, trzeba ograniczyć szerokość układ z Ten tekst jest taki, że tekst jest poza zakresem widok z TextView.

Tak, android: layout_width atrybut odgrywa tu kluczową rolę, należy go odpowiednio ustawić.

Jeden przykład 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 tutaj jeśli tekst w android: text = "To jest bardzo długi tekst wyświetlany" wychodzi z widokiem z TextView z Androidzie: layout_width = "120dp", android: ellipsize = "end" obetnie tekstu i umieść ... (3 kropki) po niej. tj. To bardzo długo ... zostanie wyświetlony w TextView.

1

można to zrobić przez xml:

<TextView 
    android:id="@+id/textview" 
    android:maxLines="1" // or any number of lines you want 
    android:ellipsize="end" 
    /> 
2

Używam horizonal Recyclerview.
1) Tutaj w CardView, TextView zostaje zniekształcony w pionie przy użyciu

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

Sprawdź śmiały TextView Wyman Group, Jaskólski ... enter image description here

2), ale kiedy użyłem SingleLine wraz z ellipsize -

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

Sprawdź śmiały TextView Wyman Group, Jaskólski ... enter image description here

Drugie rozwiązanie działało poprawnie (używając pojedynczej linii). Również testowałem w wersji OS: 4.1 i wyżej (do 8.0), działa bez żadnych awarii.