Jak zawijać tekst w widoku tekstu w systemie Android

86

Czy ktoś wie, jak zawijać tekst w TextView na platformie Android. tzn. jeśli tekst w widoku tekstowym przekracza długość ekranu, powinien zostać wyświetlony w drugiej linii.

Szukałem i próbowałem następujących rzeczy:

android:scrollHorizontally="false",
android:inputType="textMultiLine",
android:singleLine="false"

Ale nic nie działa ...

Czy ktoś może zasugerować, jak mogę to zrobić.

Sameer
źródło
7
TextViews powinno domyślnie zawijać słowa. Czy możesz opublikować cały układ?
danh32
Czy jest przypadkiem, że Textview znajduje się w układzie tabeli? Jeśli tak, mam dla ciebie odpowiedź.
JohnFx
1
W moim przypadku po dodaniu około pół tuzina atrybutów (opisanych poniżej), aby wymusić na widoku tekstowym zawijanie tekstu na wiele linii, bez powodzenia zauważyłem, że mam atrybut android:inputType="textPersonName". Najwyraźniej został dodany przez narzędzie projektowe Android Studio. Usunięcie tego atrybutu rozwiązało problem! Mogą istnieć inne typy danych wejściowych, które również uniemożliwiają zawijanie.
LarsH

Odpowiedzi:

56

U mnie ten problem wystąpił tylko na Androidzie <4.0

Kombinacja parametrów, które zastosowałem to:

android:layout_weight="1"
android:ellipsize="none"
android:maxLines="100"
android:scrollHorizontally="false"

Liczba maxLines wydawała się być losowym ostatnim elementem, który spowodował zawijanie mojego TextView.

Guykun
źródło
9
Wiem, że to stary wątek, ale pomyślałem, że opublikuję moje odkrycia. Użyłem tylko „android: maxLines”, a potem zawinął mój tekst. Cheer @Guykun
StuStirling
Ponownie, jest to równoznaczne z prostym ustawieniem wysokości TextView na match_parent, co nie jest tym samym, co zwiększenie wysokości TextView w celu uwzględnienia dodatkowych wierszy.
SMBiggs
50

Układ wiązań

<TextView
android:id="@+id/some_textview"
android:layout_width="0dp"
android:layout_height="wrap_content"

app:layout_constraintLeft_toLeftOf="@id/textview_above"
app:layout_constraintRight_toLeftOf="@id/button_to_right"/>
  • Upewnij się, że szerokość układu wynosi zero
  • zdefiniowano ograniczenia lewe / prawe
  • wysokość układu wrap_content umożliwia rozwijanie w górę / w dół.
  • Ustawiony, android:maxLines="2"aby zapobiec rozszerzaniu w pionie (2 to tylko np.)
  • Elipsy są prawdopodobne. dobry pomysł z maksymalną liczbą liniiandroid:ellipsize="end"

Szerokość 0dp pozwala na ograniczenie lewej / prawej strony do określenia szerokości twojego widżetu.

Ustawienie ograniczeń lewo / prawo ustawia rzeczywistą szerokość widżetu, w którym będzie zawijany tekst.

Dokumentacja układu ograniczeń

Piekarz
źródło
Tak! Dokładnie tak to działa! Tylko upewnij się, że ustawiłeś szerokość na 0dp
Yoraco Gonzales,
ustawienie ograniczeń lewej i prawej strony pomogło w zawinięciu go zamiast tekstu przepełnionego poza prawe granice
Jia Tse
31

W przypadku, gdy TextViewznajduje się wewnątrz a TableLayout, rozwiązaniem jest ustawienie android:shrinkColumns="1"na TableLayout. (Zastąp 1numerem kolumny, w której znajduje się TextView, w którym chcesz zawinąć. (Indeksowane 0))

AFAICT, żadne inne atrybuty nie są potrzebne w TextView.

W innych przypadkach zobacz inne odpowiedzi tutaj.

FWIW, początkowo miałem z tym coś w rodzaju pracy

 <TextView
   android:id="@+id/inventory_text"
   android:layout_width="fill_parent"
   android:layout_weight="1"
   android:width="0dp"

ale to spowodowało dodatkowe puste miejsce na dole Dialogu, w którym było wszystko.

aij
źródło
To było to, czego szukałem! W przeciwnym razie moje słowa zostaną przerwane
Carson Holzheimer
12

Musisz użyć 2 parametrów:

  • android:ellipsize="none" : tekst nie jest cięty na szerokości widoku tekstu

  • android:scrollHorizontally="false" tekst zawija się na tyle wierszy, ile potrzeba

Kartaguez
źródło
5
To nie działa dla mnie. (FWIW, mam TextView w TableRow w TableLayout.)
aij
8

Użyj app:breakStrategy="simple"w AppCompatTextView, będzie kontrolować układ akapitu.

Ma trzy stałe wartości

  • zrównoważony
  • wysoka jakość
  • prosty

Projektowanie w pliku TextView xml

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/textquestion"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:scrollHorizontally="false"
        android:text="Your Question Display Hear....Your Question Display Hear....Your Question Display Hear....Your Question Display Hear...."
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:textStyle="bold"
        app:breakStrategy="simple" />

Jeśli twój aktualny minimalny poziom api wynosi 23 lub więcej, to w Kodowaniu

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

Więcej informacji znajdziesz w BreakStrategy

Przerwa w widoku tekstowym Obraz strategii

Nirav Bhavsar
źródło
7

To powinno rozwiązać problem: android:layout_weight="1".

user755121
źródło
To po prostu powoduje, że TextView rozszerza się, aby zająć jak najwięcej miejsca, co jest tym samym, co ustawienie Height na match_parent. Niezupełnie to samo, czego chciał OP.
SMBiggs
1
W przypadku TableLayout layout_weight="1"naprawiono problem za mnie. Jednak moja TableRow, która zawiera TextView, została layout_heightustawiona na określoną wartość. Może komuś się przyda
zestaw
5

OK, prawda jest gdzieś pośrodku, bo trzeba spojrzeć na sprawę z punktu widzenia rodzica i dziecka. Poniższe rozwiązanie działa TYLKO gdy tryb spinner = dialogniezależnie od wersji Androida (nie ma problemu .. testowałem to w VD i DesireS z Androidem => 2.2):

  1. . Ustaw tryb przędzarki (rodzica) na przykład:

    android:spinnerMode="dialog"  
    
  2. Ustaw właściwości widoku tekstu (niestandardowy widok podrzędny) na:

    android:layout_weight="1"  
    android:ellipsize="none"  
    android:maxLines="100"  
    android:scrollHorizontally="false"
    

Mam nadzieję, że to działa również dla Ciebie.

skourkos
źródło
Próbowałem tak wielu rzeczy, aby działało w trybie rozwijania, ale nic nie działało. Teraz zdecydowałem się na tryb „dialogowy”.
Mangesh
4

Ustawienie android:maxEmsdanej wartości razem z android:layout_weight="1"spowoduje zawijanie TextView po osiągnięciu określonej długości ems.

Freddroid
źródło
Działa również dla TextView umieszczonego w RelativeLayout.
ayz4sci
szukałem godzinami, dzięki, świetnie działa też na constraintLayout
TarekB
3

W Android Studio 2.2.3 pod inputTypewłaściwością znajduje się właściwość o nazwie textMultiLine. Wybranie tej opcji rozwiązało u mnie podobny problem. Mam nadzieję że to pomogło.

user7652193
źródło
2
To jest dla EditText, a nie Textview
PsychedelicSubstance
2

Właśnie pracowałem nad TextView wewnątrz układu w RecyclerView. Miałem tekst coraz odcięty, EX, dla Read this messageujrzałem: Read this. Próbowałem ustawić android:maxLines="2"w TextView, ale nic się nie zmieniło. Jednak android:lines="2"zaowocował w Read thispierwszej linii i messagena drugiej.

Stan Kurdziel
źródło
1

Miałem ten sam problem. Po zmianie to zadziałało -

android:layout_width="wrap_content"

Wielokropek, maxLines lub layout_weight - wszystko to nie robiło różnicy. Uwaga - szerokość elementu nadrzędnego jest również ustawiana jako wrap_content.

Medha
źródło
1

Wszystko, co musisz zrobić, to ustawić szerokość widoku tekstu .

android: layout_width = "60dp"

możesz zmienić szerokość według własnego wyboru. Po prostu wpisz długie zdanie, aby sprawdzić, czy działa w ten sposób

android: text = "Chcę być wśród światowej klasy inżynierów oprogramowania"

Akindev
źródło
1

Wypróbuj podejście @ Guykun

android:layout_weight="1" android:ellipsize="none" android:maxLines="100" android:scrollHorizontally="false"

Upewnij się również, że szerokość nadrzędna nie jest ustawiona na zawijanie zawartości. To jest to, czego mi brakowało.

Shailendra Suriyal
źródło
0

Używam Androida 2.2 i mój widok tekstu automatycznie przejdzie do następnej linii, jeśli przekroczy ekran.

Jeśli chcesz, aby tekst znalazł się w następnej linii przed końcem ekranu, po prostu dodaj (po prostu wpisz własną wartość dp). Będzie to przydatne, jeśli masz zdjęcie po prawej stronie tekstu.

android:layout_marginRight="52dp"
Britc
źródło
0

Dziwne - stworzyłem TextView w kodzie i zawinął - mimo że nie ustawiłem niczego poza standardowymi rzeczami - ale przekonaj się sam:

LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);
childParams.setMargins(5, 5, 5, 5);

Label label = new Label(this);
label.setText("This is a testing label This is a testing label This is a testing label This is a testing labelThis is a testing label This is a testing label");
label.setLayoutParams(childParams);

Jak widać z definicji parametrów, używam LinearLayout. Klasa Label po prostu rozszerza TextView - nie robi nic poza ustawieniem rozmiaru i koloru czcionki.

Podczas uruchamiania go w emulatorze (poziom API 9) automatycznie zawija tekst w 3 liniach.

Ready4Android
źródło
Zwróć uwagę na użycie tego kodu LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);. Najprawdopodobniej oznacza to opakowanie, które uważasz za „automagiczne”
nemesisfixx
0

Po prostu ustaw określony layout_withrozmiar, gdy tekst wypełni maksymalną szerokość, przepełni się do następnej linii, powodując efekt zawijania.

<TextView
    android:id="@+id/segmentText"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/segmentHeader"
    android:text="You have the option to record in one go or segments(if you swap options 
    you will loose your current recordings)"
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>
Frank Odoom
źródło
0

Sztuczka polega na szerokości textView, spróbuj nadać mu dedykowaną liczbę, taką jak:

<TextView
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>

Próbowałem wielu rozwiązań bez rezultatu, próbowałem:

    android:ellipsize="none"
    android:scrollHorizontally="false"

jedyną rzeczą, która wyzwoliła opcję zawijania, jest dedykowana szerokość

Ahmed Khalid Kadhim
źródło
-1

Musisz dodać swój TextView w ScrollView za pomocą czegoś takiego:

<ScrollView android:id="@+id/SCROLL_VIEW"  
android:layout_height="150px"   
android:layout_width="fill_parent">  

<TextView   
   android:id="@+id/TEXT_VIEW"   
   android:layout_height="wrap_content"   
   android:layout_width="wrap_content"   
   android:text="This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header" />  
 </ScrollView>
Ludovic Landry
źródło
4
Dziękuję za odpowiedź. Ale moim celem jest zawijanie tekstu, gdy przekracza on długość linii, aby nie umieszczać poziomego przewijania.
Sameer