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?

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>

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.


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)


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

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>

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.


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


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.


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.


2

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

android:inputType="textMultiLine"

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

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.


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

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


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

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


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.