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

Chatar Veer Suthar
źródło

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>
Zarah
źródło
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.

Ryan
źródło
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)

Maragues
źródło
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"/> 
Naunidh Singh
źródło
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>
Pravin Bhosale
źródło
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.

Boris Strandjev
źródło
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 :)

Khalil Meg
źródło
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.

Gulzar Bhat
źródło
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.

Eduardo Lopez
źródło
2

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

android:inputType="textMultiLine"
Bhuvan Bhatt
źródło
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" />
Enakhi
źródło
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.

Susana Mar Flores
źródło
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>
Jitendra Nandiya
źródło
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

dAv dEv
źródło
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"/>
Sneg
źródło
-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.

Tara Prasad Sharma
źródło
-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.

saleh sereshki
źródło
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.

Rasel
źródło
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