Como quebrar o texto em textview no Android

86

Alguém sabe quebrar o texto em TextView na plataforma Android. ou seja, se o texto em visualização de texto exceder o comprimento da tela, ele deve ser exibido na segunda linha.

Eu pesquisei e tentei o seguinte:

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

Mas nenhum funciona ..

Alguém pode sugerir como posso fazer isso.

Sameer
fonte
7
TextViews deve quebrar por padrão. Você pode postar todo o seu layout?
danh32
Por acaso o Textview está dentro de um layout de tabela? Se sim, tenho uma resposta para você.
JohnFx de
1
No meu caso, depois de adicionar cerca de meia dúzia de atributos (descritos abaixo) para forçar o textview a quebrar o texto em várias linhas, sem sucesso, percebi que tinha um atributo android:inputType="textPersonName". Aparentemente, ele foi adicionado pela ferramenta de design do Android Studio. Remover esse atributo corrigiu o problema! Pode haver outros tipos de entrada que também impedem o empacotamento.
LarsH

Respostas:

55

Para mim, esse problema só ocorreu no Android <4.0

A combinação de parâmetros que usei foi:

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

A contagem de maxLines parecia ser a parte final aleatória que fez meu TextView embrulhar.

Guykun
fonte
9
Eu sei que é um tópico antigo agora, mas pensei em postar minhas descobertas. Usei apenas o 'android: maxLines' e então embrulhei meu texto. Torcida @Guykun
StuStirling,
Novamente, isso equivale a simplesmente definir a altura de TextView para match_parent, o que não é a mesma coisa que fazer a altura de TextView expandir para incluir as linhas extras.
SMBiggs de
50

Layout de restrição

<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"/>
  • Certifique-se de que a largura do seu layout seja zero
  • restrições esquerda / direita são definidas
  • a altura do layout de wrap_content permite a expansão para cima / para baixo.
  • Defina android:maxLines="2"para evitar a expansão vertical (2 é apenas um exemplo)
  • As elipses são prob. uma boa ideia com linhas máximasandroid:ellipsize="end"

A largura de 0 dp permite restrições à esquerda / direita para determinar a largura do widget.

Definir as restrições esquerda / direita define a largura real de seu widget, dentro da qual o texto será quebrado.

Documentos de layout de restrição

padeiro
fonte
Sim! É exatamente assim que funciona! Apenas certifique-se de definir a largura para 0 dp
Yoraco Gonzales
definir as restrições esquerda e direita ajudou a envolvê-lo para mim, em vez de o texto transbordar além dos limites direitos
Jia Tse
31

Para o caso em que o TextViewestá dentro de umTableLayout , a solução é definir android:shrinkColumns="1"no TableLayout. (Substitua 1pelo número da coluna em que está o TextView que você deseja agrupar. (Indexado em 0))

AFAICT, nenhum outro atributo é necessário no TextView.

Para outros casos, veja as outras respostas aqui.

FWIW, inicialmente comecei a trabalhar com

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

mas isso resultou em algum espaço vazio extra na parte inferior do diálogo em que estava tudo incluído.

aij
fonte
Era isso que eu procurava! Caso contrário, minhas palavras serão cortadas
Carson Holzheimer
12

Você deve usar 2 parâmetros:

  • android:ellipsize="none" : o texto não é cortado na largura do textview

  • android:scrollHorizontally="false" o texto quebra em quantas linhas forem necessárias

Kartaguez
fonte
5
Isso não está funcionando para mim. (FWIW, eu tenho um TextView em um TableRow em um TableLayout.)
aij
8

Use app:breakStrategy="simple"em AppCompatTextView, ele controlará o layout do parágrafo.

Tem três valores constantes

  • equilibrado
  • alta qualidade
  • simples

Projetando em seu 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" />

Se o seu nível de API mínimo atual é 23 ou mais, em Coding

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

Para mais referências, consulte esta BreakStrategy

Textview breakStrategy image

Nirav Bhavsar
fonte
7

Isso deve resolver o seu problema: android:layout_weight="1".

usuário755121
fonte
Isso apenas faz com que TextView se expanda para ocupar o máximo de espaço possível, que é o mesmo que definir Height como match_parent. Não exatamente a mesma coisa que OP queria.
SMBiggs
1
No caso do TableLayout, layout_weight="1"resolveu o problema para mim. No entanto, meu TableRow que contém o TextView, foi layout_heightdefinido com um valor específico. Talvez seja útil para alguém
kit
5

OK pessoal, a verdade está em algum lugar no meio, porque você tem que ver a questão do ponto de vista dos pais e dos filhos. A solução abaixo funciona SOMENTE quando o modo giratório = dialogindependente da versão do Android (sem problemas .. testei em VD e DesireS com Android => 2.2):

  1. . Defina o modo giratório (pai) como:

    android:spinnerMode="dialog"  
    
  2. Defina as propriedades do textview (visão personalizada filha) para:

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

Espero que isso funcione para você também.

Skourkos
fonte
Tentei tantas coisas fazer funcionar no modo 'suspenso', mas nada funcionou. Agora estabelecido no modo 'diálogo'.
Mangesh
4

Ao definir android:maxEmsum determinado valor junto com android:layout_weight="1"fará com que o TextView seja quebrado assim que atingir o comprimento determinado do ems.

Freddroid
fonte
Funciona para TextView colocado em RelativeLayout também.
ayz4sci
procuramos por horas, obrigado, ele funciona muito bem no constraintLayout também
TarekB
3

No Android Studio 2.2.3 na inputTypepropriedade, há uma propriedade chamada textMultiLine. Selecionar esta opção resolveu um problema semelhante para mim. Espero que ajude.

user7652193
fonte
2
Isto é para EditText, não Textview
PsychedelicSubstance
2

Estava trabalhando em um TextView dentro de um layout dentro de um RecyclerView. Eu tinha texto ficar cortada, ex, para Read this message, eu vi: Read this. Tentei configurar android:maxLines="2"no TextView, mas nada mudou. No entanto, android:lines="2"resultou na Read thisprimeira linha e messagena segunda.

Stan Kurdziel
fonte
1

Eu tive o mesmo problema. Após a mudança, funcionou -

android:layout_width="wrap_content"

As reticências, maxLines ou layout_weight - todos não fizeram nenhuma diferença. Nota - A largura principal também é definida como wrap_content.

Medha
fonte
1

Tudo que você precisa fazer é definir a largura da visualização do texto .

android: layout_width = "60dp"

você pode alterar a largura de sua escolha. Basta digitar uma frase longa para verificar se funciona assim

android: text = "quero estar entre os engenheiros de software de classe mundial"

Akindev
fonte
1

Experimente a abordagem de @ Guykun

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

Além disso, certifique-se de que a largura dos pais não esteja definida para envolver o conteúdo. Isso é o que eu estava perdendo.

Shailendra Suriyal
fonte
0

Estou usando o Android 2.2 e meu textview irá automaticamente para a próxima linha se exceder a tela.

Se você quiser que o texto vá para a próxima linha antes do final da tela, basta adicionar (basta inserir seu próprio valor dp). Isso será útil se você tiver uma imagem à direita do texto.

android:layout_marginRight="52dp"
Britânico
fonte
0

Estranho o suficiente - criei meu TextView em Code e ele foi encerrado - apesar de eu não ter configurado nada, exceto coisas padrão - mas veja por si mesmo:

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

Como você pode ver na definição dos parâmetros, estou usando um LinearLayout. A classe Label simplesmente estende TextView - não fazendo nada ali, exceto definir o tamanho e a cor da fonte.

Ao executá-lo no emulador (API de nível 9), ele quebra automaticamente o texto em 3 linhas.

Ready4Android
fonte
Observe o uso deste código LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);. Provavelmente é isso que faz o embrulho que você considera ser "automagic"
nemesisfixx
0

Basta definir layout_withum tamanho definido , quando o texto preencher a largura máxima, ele irá transbordar para a próxima linha causando um efeito de quebra automática.

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

O truque é com a largura textView, tente torná-la um número dedicado como:

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

Já tentei muitas soluções sem nenhum resultado, tentei:

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

a única coisa que acionou a opção de contorno é a largura dedicada

Ahmed Khalid Kadhim
fonte
-1

Você precisa adicionar seu TextView em um ScrollView com algo assim:

<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
fonte
4
Obrigado pela sua resposta Mas meu objetivo é quebrar o texto quando ele ultrapassar o comprimento da linha para não colocar um scroller horizontal.
Sameer