Wielowierszowy TextView w systemie Android?


154

Podobało mi się poniżej w xml

<TableRow>
    <TextView android:id="@+id/address1"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4" 
        android:singleLine="false"              
        android:text="Johar Mor, Gulistan-e-Johar, Karachi" >
    </TextView> 
</TableRow>

To nie działa multilinei używam TableLayout...

więc jaki błąd tutaj robię?

Odpowiedzi:


197

Jeśli wstawiany tekst TextViewjest krótki, nie rozszerzy się automatycznie do czterech wierszy. Jeśli chcesz, TextViewaby zawsze miał cztery wiersze, niezależnie od długości zawartego w nim tekstu, ustaw android:linesatrybut:

<TextView
    android:id="@+id/address1"
    android:gravity="left"
    android:layout_height="fill_parent"
    android:layout_width="wrap_content"
    android:maxLines="4"
    android:lines="4"
    android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."></TextView>

Możesz to zrobić za pomocą TableRow, patrz poniższy kod

<TableRow >
        <TextView
            android:id="@+id/tv_description_heading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:padding="8dp"
            android:text="@string/rating_review"
            android:textColor="@color/black"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:maxLines="4"`enter code here`
            android:padding="8dp"
            android:text="The food test was very good."
            android:textColor="@color/black"
            android:textColorHint="@color/hint_text_color" />
    </TableRow>

21
OP nie „chciał, aby TextView zawsze miał cztery wiersze, niezależnie od długości zawartego w nim tekstu”.
tar

7
Ta odpowiedź zadziałała dla mnie. Ale uzyskałem najlepsze wyniki, nie z liniami max i liniami, ale z liniami max i minline i nie użyłem linii. Ustawiłem linie min na 1, a linie maksymalne większe niż największe dane. W ten sposób otrzymuję od 1 do N linii, aby uzyskać zwarty widok danych.
R Earle Harris

1
@REarleHarris: Ja też wypróbowałem to samo rozwiązanie, ale problem polega na tym, że nie liczy ono maxLines. Wszystkie dane są wyświetlane w liczbie minLines. Czego mogę teraz spróbować Używam niestandardowego widoku
tekstu w formacie

119

Pomyślałem, że dodam, że jeśli użyjesz:

android:inputType="textMultiLine"

Wtedy widok przestaje być klikalny. Próbowałem uzyskać wielowierszowe podglądy tekstu w moim menu szuflady slajdów, które oczywiście musi reagować na kliknięcia.

Jednak android:singleLine="false"działało dobrze.


3
To nie jest dokładnie poprawne, ponieważ własne błędy lint systemu Android sugerują, że używasz tego atrybutu tylko z EditText, a nie TextView.
Jared

1
Czy odnosisz się do tekstu Multiline? Powiedziałem, żeby tego nie używać. singleLine działa dobrze na TextViews: developer.android.com/reference/android/widget/ ...
Ryan

3
android: singleLine jest teraz przestarzały
Humberto Castañeda

Jesteś pewny? Nie wspomina, że ​​w dokumentach, do których odsyłam w powyższym komentarzu, chociaż właśnie zobaczyłem, że jest to oznaczone jako takie w dokumentacji res. Dziwne, że nie wspominają o tym na stronie TextView. Problem polega na tym, że proponowane przez nich obejście (wielowierszowe) uniemożliwia klikanie widoku, gdy umieszczam w moim OP. developer.android.com/reference/android/R.attr.html#singleLine
Ryan,

3
android: singleLine = "false" jest przestarzały, ponieważ jest to wartość domyślna
Ashraf Alshahawy

28

Żadna z odpowiedzi mi się nie podoba. Po prostu ustaw inputType, a TextView dostosuje się do jego zawartości

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textMultiLine"/>

Przetestowano na Nexusie One (2.3) i Nexusie 4 (4.4)


52
android: inputType = "textMultiLine" nie jest przeznaczony dla TextView, ale dla EditText, a jeśli spróbujesz to zrobić, otrzymasz ostrzeżenie
bhaskarc

2
Powinieneś słuchać ostrzeżeń. Użyj rozwiązania @Ryans.
m02ph3u5

15

Po prostu umieść „\ n” w tekście ... nie jest wymagany żaden dodatkowy atrybut :)

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Pigeon\nControl\nServices"
            android:id="@+id/textView5"
            android:layout_gravity="center"
            android:paddingLeft="12dp"/> 

6
to rozwiązanie nie może być używane do dynamicznego ustawiania tekstu
Sagar Devanga

@SagarDevanga Co to znaczy dynamicznie ustawiać tekst?
czerwiec

3
@SagarDevanga, właśnie sprawdziłem, dynamiczne i statyczne teksty są domyślnie multilinowane (jeśli są używane \n), więc jest to właściwe rozwiązanie. Nie singleLine=false, nie lines=4i tak dalej.
CoolMind

10

Po prostu dodaj widok tekstu w ScrollView

<ScrollView
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:layout_marginLeft="15dp"
           android:layout_marginRight="15dp"
           android:layout_marginTop="20dp"
           android:fillViewport="true">

           <TextView
               android:id="@+id/txtquestion"
               android:layout_width="fill_parent"
               android:layout_height="match_parent"
               android:background="@drawable/abs__dialog_full_holo_light"
               android:lines="20"
               android:scrollHorizontally="false"
               android:scrollbars="vertical"
               android:textSize="15sp" />

       </ScrollView>

5

Nie podoba mi się rozwiązanie, które wymusza liczbę wierszy w widoku tekstu. Raczej sugeruję, abyś rozwiązał to za pomocą proponowanego tutaj rozwiązania . Jak widzę, program operacyjny również zmaga się z tym, aby widok tekstu wyglądał jak właściwy w tabeli i shrinkColumnsjest to właściwa dyrektywa, którą należy przekazać, aby osiągnąć zamierzony cel.


5

Spróbuj pracować z EditText, sprawiając, że jest niemożliwy do kliknięcia i nieusunięty, a także możesz wyświetlić pasek przewijania i usunąć dolny pasek EditText.
Oto przykład:

<EditText
android:id="@+id/my_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_parent"
android:inputType="textMultiLine"                   <!-- multiline -->
android:clickable="false"                         <!-- unclickable -->
android:focusable="false"                         <!-- unfocusable -->
android:scrollbars="vertical"     <!-- enable scrolling vertically -->
android:background="@android:color/transparent"   <!-- hide the underbar of EditText -->
/>  

Mam nadzieję że to pomoże :)


3

Najpierw zamień na "\n"jego Htmlekwiwalent, "&lt;br&gt;" a następnie wywołaj Html.fromHtml()łańcuch. Wykonaj poniższe kroki:

String text= model.getMessageBody().toString().replace("\n", "&lt;br&gt;")
textView.setText(Html.fromHtml(Html.fromHtml(text).toString()))

To działa doskonale.


2

Nauczyłem się dodawania „\ n” między słowami, w których chcesz, aby przerwał się w następnej linii. Na przykład...

<TextView
    android:id="@+id/time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAlignment="center"
    android:text="M-F 9am-5pm \n By Appointment Only" />

\ N między 17:00 a Przez pozwolił mi na większą kontrolę nad tym, gdzie powinien zaczynać się i kończyć mój następny wiersz.


2

Najlepsza odpowiedź, jaką znalazłem dla wielowierszowego TextView, to:

android:inputType="textMultiLine"

8
Nie android:inputTypejest atrybutem dla <EditText>nie dla <TextView>?
timtim

Ostrzeżenie pojawi się, jeśli dodasz ten atrybut do TextView. - Android: inputType = "textMultiLine" z atrybutami nie powinien być używany z <TextView>. Właściwie ten atrybut jest przeznaczony dla EditText.
Yhondri

2

możesz użyć Androida: inputType = "textMultiLine"

  <TextView android:id="@+id/address1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:gravity="left"
    android:maxLines="4" 
    android:inputType="textMultiLine"
    android:text="Johar Mor, Gulistan-e-Johar, Karachi" />

1
Jest to pokazane jako ostrzeżenie. Nie jest przeznaczony do użytku w TextView
Stealth Rabbi

1
inputType obsługuje tylko komponenty EditText.
Chamin Wickramarathna

1

Użyłem:

TableLayout tablelayout = (TableLayout) view.findViewById(R.id.table);
tablelayout.setColumnShrinkable(1,true);

to działało dla mnie. 1 to liczba kolumn.


0
You can do this with TableRow, see below code

<TableRow >
    <TextView
        android:id="@+id/tv_description_heading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:padding="8dp"
        android:text="@string/rating_review"
        android:textColor="@color/black"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4"`enter code here`
        android:padding="8dp"
        android:text="The food test was very good."
        android:textColor="@color/black"
        android:textColorHint="@color/hint_text_color" />
</TableRow>

0

Najprostszy sposób

<TableRow>
    <TextView android:id="@+id/address1"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4" 
        android:singleLine="false"              
        android:text="Johar Mor,\n Gulistan-e-Johar,\n Karachi" >
    </TextView> 
</TableRow>

Użyj \ntam, gdzie chcesz wstawić nową linię. Mam nadzieję, że to ci pomoże


0

Kluczem do sukcesu jest TextView z singleline=false(który tak jest nieaktualna, ale to musi mieć do pracy) w połączeniu z lines, maxlineslubminlines

<TextView
                android:id="@+id/txtBowlers"
                style="@style/Default_TextBox.Small"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:singleLine="false"
                android:maxLines="6"
                android:text="Bob\nSally\nJohn"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="@+id/txtTeamName"
                app:layout_constraintTop_toBottomOf="@+id/txtTeamName"/>

-1

Dlaczego nie zadeklarujesz łańcucha zamiast wpisywać długie wiersze do pliku układu. W tym celu musisz zadeklarować wiersz kodu w pliku układu 'android: text = "@ string / text"' i przejść do \\ app \ src \ main \ res \ values ​​\ strings.xml i dodać wiersz kodu „Tutaj Twój tekst wielowierszowy” Użyj także „\ n”, aby przerwać linię z dowolnego miejsca, w którym linia zostanie automatycznie dopasowana.


-4

u mnie żadne z rozwiązań nie zadziałało. Wiem, że nie jest to pełna odpowiedź na to pytanie, ale czasami może pomóc.

Umieściłem 4 widoki tekstu w pionowym układzie liniowym.

<Linearlayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation:"vertical"

    ...>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line1"
       .../>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line2"
       .../>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line3"
       .../>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line4"
       .../>
</LinearLayout>

To rozwiązanie jest dobre w przypadkach, gdy tekst widoku tekstu jest stały, podobnie jak etykiety.


1
Proszę, nie rób tego.
humble_wolf

-23

TextView będzie wieloliniowy, gdy nie będzie miał wystarczająco dużo miejsca, aby zmieścić się w pojedynczej linii, a singLine nie jest ustawiony na true.

Jeśli zajmie spację w jednym wierszu, nie będzie to wiele wierszy.


7
A jeśli chcę użyć fill_parent zamiast stałej szerokości? Moja treść jest ograniczona, jeśli to zrobię ...
happyhardik

6
Spróbuję android:singleLine="false"lub android:inputType="textMultiLine"(zgodnie z opisem Marageusa). Uwaga, która android:inputType="textMultiLine"ma pierwszeństwo, gdy oba są obecne
Romantyczny Elektron

Dzieląc się poglądami innych, którzy skomentowali, jest to całkowicie błędne i jestem zdumiony, dlaczego jest to akceptowana odpowiedź.
Aleks G
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.