TextView multilinha no Android?

154

Eu gostei abaixo em 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>

Não está funcionando para multiline e estou usando TableLayout...

então qual é o erro que estou cometendo aqui?

Chatar Veer Suthar
fonte

Respostas:

197

Se o texto que você está inserindo TextViewfor curto, ele não será expandido automaticamente para quatro linhas. Se você deseja TextViewque sempre tenha quatro linhas, independentemente do tamanho do texto, defina o android:linesatributo:

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

Você pode fazer isso com o TableRow, veja o código abaixo

<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
fonte
21
O OP " não queria que o TextView sempre tivesse quatro linhas, independentemente do tamanho do texto".
tar
7
Essa resposta funcionou para mim. Mas obtive os melhores resultados, não com linhas máximas e linhas, mas com linhas máximas e linhas mínimas e não usei linhas. Defino minlines como 1 e maxlines maiores que os maiores dados. Dessa forma, recebo de 1 a N linhas para uma visão compacta dos dados.
R Earle Harris
1
@REarleHarris: Eu também tentei a mesma solução, mas o problema é que ele não está levando a contagem de maxLines. Todos os dados são exibidos na contagem de minLines. O que eu posso tentar agora eu estou usando textview personalizado no xml
Sagar Devanga
119

Eu apenas pensei em acrescentar que se você usar:

android:inputType="textMultiLine"

Em seguida, a visualização deixa de ser clicável. Eu estava tentando obter visualizações de texto com várias linhas no menu da gaveta, o que obviamente precisa responder a cliques.

O android:singleLine="false"funcionou bem embora.

Ryan
fonte
3
Isso não é exatamente correto, pois os próprios erros de cotão do Android sugerem que você use esse atributo apenas com o EditText e não o TextView.
Jared
1
Você está se referindo ao texto Multiline? Eu disse para não usar isso. O singleLine é bom em TextViews: developer.android.com/reference/android/widget/…
Ryan
3
android: singleLine está obsoleto agora
Humberto Castañeda
Você tem certeza? Ele não menciona que nos documentos aos quais vinculo o comentário acima, embora eu tenha acabado de ver que ele está marcado como tal nos res docs. Estranho, eles não mencionam isso na página TextView. O problema é que a solução alternativa que eles sugerem (multilinhas) impede que a exibição seja clicável quando eu coloco no meu OP. developer.android.com/reference/android/R.attr.html#singleLine
Ryan
3
android: singleLine = "false" está obsoleta, pois é o valor padrão
Ashraf Alshahawy
28

Eu não gosto de nenhuma das respostas. Basta definir o inputType e o TextView se adaptará ao seu conteúdo

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

Testado em um Nexus One (2.3) e Nexus 4 (4.4)

Maragues
fonte
52
android: inputType = "textMultiLine" não é para TextView, sua para EditText e você receberá um aviso se você tentar fazer isso
bhaskarc
2
Você deve ouvir os avisos. Use a solução @Ryans.
M02ph3u5
15

Basta colocar '\ n' dentro do seu texto ... nenhum atributo extra é necessário :)

          <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
fonte
6
esta solução não pode ser usado para a criação de texto dinamicamente
Sagar Devanga
@SagarDevanga O que significa definir texto dinamicamente?
juil 25/05
3
@SagarDevanga, acabei de verificar, textos dinâmicos e estáticos são multilinados por padrão (se usados \n), por isso é a solução certa. Não singleLine=false, não lines=4e assim por diante.
CoolMind 18/08
10

Basta adicionar a visualização de texto no 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
fonte
5

Não gosto da solução que força o número de linhas na exibição de texto. Eu sugiro que você o resolva através da solução proposta aqui . Na minha opinião, o OP também está lutando para tornar a exibição de texto adequada na tabela e shrinkColumnsé a diretiva correta a ser adotada para alcançar o que é desejado.

Boris Strandjev
fonte
5

Tente trabalhar com o EditText, tornando-o impossível de ser clicado e desfocado, também é possível exibir uma barra de rolagem e excluir a barra inferior do EditText.
Aqui está um exemplo:

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

Espero que isto ajude :)

Khalil Meg
fonte
3

Primeiro substitua "\n"pelo seu Htmlequivalente e "&lt;br&gt;" depois chame Html.fromHtml()a corda. Siga as etapas abaixo:

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

Isso funciona perfeitamente.

Gulzar Bhat
fonte
2

O que aprendi foi adicionar "\ n" entre as palavras em que você deseja que ele entre na próxima linha. Por exemplo...

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

As \ n entre as 17:00 e a By me permitiram ter mais controle de onde eu queria que minha próxima linha começasse e terminasse.

Eduardo Lopez
fonte
2

A melhor resposta que encontrei para o TextView com várias linhas é:

android:inputType="textMultiLine"
Bhuvan Bhatt
fonte
8
Não é android:inputTypeum atributo para <EditText>não <TextView>?
timtim 6/09/17
Um aviso será exibido se você adicionar esse atributo a um TextView. - Android atribuído: inputType = "textMultiLine" não deve ser usado com <TextView>. Na verdade, esse atributo é para EditText.
Yhondri 28/08/19
2

você pode usar o android: 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
fonte
1
Isso é mostrado como um aviso. Não foi feito para ser usado no TextView
Stealth Rabbi
1
inputType é apenas suporte para componentes EditText.
Chamin Wickramarathna
1

Eu usei:

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

funcionou para mim. 1 é o número da coluna.

Susana Mar Flores
fonte
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
fonte
0

Maneira mais simples

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

Use \nonde você deseja inserir uma nova linha. Espero que isso ajude você.

dAv dEv
fonte
0

A chave é um Textview com singleline=false(que sim está obsoleto, mas é necessário ter que trabalhar) combinado com lines, maxlinesouminlines

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

Por que você não declara uma string em vez de escrever uma linha longa no arquivo de layout. Para isso, você deve declarar uma linha de código no arquivo de layout 'android: text = "@ string / text"' e ir para o \\ app \ src \ main \ res \ values ​​\ strings.xml e adicionar uma linha de código 'Your text multiline here' Também use '\ n' para quebrar a linha a partir de qualquer ponto, caso contrário a linha será ajustada automaticamente.

Tara Prasad Sharma
fonte
-4

para mim, nenhuma das soluções não funcionou. Sei que não é uma resposta completa para esta pergunta, mas às vezes pode ajudar.

Coloquei 4 visualizações de texto em um layout linear vertical.

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

Essa solução é boa para casos em que o texto da exibição de texto é constante, como rótulos.

saleh sereshki
fonte
1
Por favor, não faça isso.
Humble_wolf
-23

O TextView terá várias linhas quando não houver espaço suficiente para caber na linha única e o singLine não estiver definido como true.

Se obtiver o espaço em uma linha, não será multi-linha.

Rasel
fonte
7
E se eu quiser usar fill_parent em vez de largura fixa? Meu conteúdo é cortado, se eu fizer isso ...
happyhardik
6
Vou tentar android:singleLine="false"ou android:inputType="textMultiLine"(como descrito por Marageus) .Notice que android:inputType="textMultiLine"tem precedência quando ambos estão presentes
Romantic Electron
Compartilhando as opiniões de outras pessoas que comentaram, isso está completamente errado e estou surpreso com o motivo pelo qual essa é a resposta aceita.
Aleks G