Android, como limitar a largura do TextView (e adicionar três pontos no final do texto)?


317

Eu tenho um TextViewque eu quero limitar os caracteres. Na verdade, eu posso fazer isso, mas o que estou procurando é como adicionar três pontos (...) no final da string. Este mostra que o texto continuou. Este é o meu XML, mas não há pontos, embora limite meu texto.

<TextView 
        android:id                      = "@+id/tvFixture"
        android:layout_width            = "wrap_content"
        android:layout_height           = "wrap_content"
        android:layout_toLeftOf         = "@id/ivFixture_Guest"
        android:text                    = "@string/test_06"
        android:lines                   = "1"
        android:ems                     = "3"
        android:gravity                 = "right"
        style                           = "@style/simpletopic.black" 
        android:ellipsize="end"/>

Respostas:


693

Descontinuada:

Adicione mais uma propriedade android:singleLine="true"no seu Textview

Atualizada:

android:ellipsize="end" 
android:maxLines="1"

3
Definitivamente preciso da singleLine quando tentei isso. Mesmo que esteja obsoleto.
— EGHDK 20/08/13

41
android: singleLine = "true" está obsoleto e tem efeitos colaterais ruins. use android: ellipsize = "end" e maxLine = "1" em vez disso
— Hamidreza Hosseinkhani

1
Quais são os "efeitos colaterais ruins" do uso singleLine? Consulte também: O atributo xml singleLine está obsoleto ou não está no Android?
— Suragch

1
btw, o Android: maxLines pode ser maior do que 1 se quiser :)
— Touré Titular

1
Alguém tem essa mensagem "W / StaticLayout: maxLineHeight não deve ser -1. MaxLines: 1 lineCount: 1">?
— ICE FRIO 26/03

157

A seguir, é o que aprendi brincando com várias opções para forçar TextViewa uma linha única (com e sem os três pontos).

insira a descrição da imagem aqui

android: maxLines = "1"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="one two three four five six seven eight nine ten" />

Isso apenas força o texto a uma linha. Qualquer texto extra está oculto.

Palavras-chave:

ellipsize = "end"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:ellipsize="end"
    android:text="one two three four five six seven eight nine ten" />

Isso corta o texto que não se encaixa, mas permite que os usuários saibam que o texto foi truncado adicionando reticências (os três pontos).

Palavras-chave:

ellipsize = "letreiro"

<TextView
    android:id="@+id/MarqueeText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="one two three four five six seven eight nine ten" />

Isso faz o texto rolar automaticamente pelo TextView. Observe que às vezes precisa ser definido no código:

textView.setSelected(true);

Supostamente android:maxLines="1"e android:singleLine="true"deve fazer basicamente a mesma coisa e, como o singleLine está aparentemente obsoleto, eu preferiria não usá-lo, mas quando o tiro, a marca de seleção não rola mais. LevandomaxLines não afeta, no entanto.

Palavras-chave:

HorizontalScrollView with scrollHorizontally

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/horizontalScrollView">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:scrollHorizontally="true"
        android:text="one two three four five six seven eight nine ten" />
</HorizontalScrollView>

Isso permite que o usuário role manualmente para ver toda a linha de texto.


Mas isso é apenas elipsizar no final de cada palavra. Existe alguma maneira de adicionar ... no meio de um espaço_muito_longo_compras_whitespace ...?
— 9607 Tobias Reich

@TobiasReich, não conheço uma maneira construída de fazer isso. Você pode criar o seu próprio usando o Paint.measureText .
— Suragch 8/03/2017

Às vezes você pode precisar do aplicativo: layout_constrainedWidth = "true" também
— Dan Crisan

80

Experimente esta propriedade do TextView no seu arquivo de layout.

android:ellipsize="end"
android:maxLines="1"

31

Suponho que você queira limitar a largura a uma linha e não limitar por caractere? Como singleLineestá obsoleto, você pode tentar usar o seguinte juntos:

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"

13

por exemplo. você pode usar

android:maxLength="13"

isso restringirá o tamanho do texview a 13, mas o problema é que, se você tentar adicionar 3 pontos (...), ele não será exibido, pois fará parte do tamanho do texto.

     String userName;
     if (data.length() >= 13) {
            userName = data.substring(0, 13)+ "...";

     } else {

            userName = data;

    }
        textView.setText(userName);

além disso você tem que usar

 android:maxLines="1"

2
Você deve usar melhor "\ u2026" em vez de "..."
— Zharro

isso foi apenas um exemplo. se eu estou colocando strings em Strings.xml, então definitivamente vou para unicodes. Algum motivo específico que você deseja colocar aqui?
— Nayanesh Gupte

2
Não. Eu pessoalmente tenho recentemente teve conhecimento da existência deste personagem no Unicode e decidiu compartilhar esse conhecimento;)
— Zharro

6

Usar

  • android:singleLine="true"
  • android:maxLines="1"
  • app:layout_constrainedWidth="true"

É assim que minha TextViewaparência completa :

    <TextView
    android:id="@+id/message_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="5dp"
    android:maxLines="1"
    android:singleLine="true"
    android:text="NAME PLACEHOLDER MORE Text"
    android:textColor="@android:color/black"
    android:textSize="16sp"

    android:textStyle="bold"
    app:layout_constrainedWidth="true"
    app:layout_constraintEnd_toStartOf="@id/message_check_sign"
    app:layout_constraintHorizontal_bias="0"
    app:layout_constraintStart_toEndOf="@id/img_chat_contact"
    app:layout_constraintTop_toTopOf="@id/img_chat_contact" />

Imagem do <code> TextView </code>


5

Estou usando o Horizonal Recyclerview.
1) Aqui no CardView, o TextView fica distorcido verticalmente ao usar

android:ellipsize="end"
android:maxLines="1"

Confira o TextViews Wyman Group em negrito, Jaskolski ... insira a descrição da imagem aqui

2) Mas quando eu usei o singleLine junto com o elipsize -

android:ellipsize="end"
android:singleLine="true"

Confira o TextViews Wyman Group em negrito, Jaskolski ... insira a descrição da imagem aqui

A segunda solução funcionou corretamente para mim (usando o singleLine). Também testei na versão do sistema operacional: 4.1 e superior (até 8.0), está funcionando bem sem falhas.


4

código:

TextView your_text_view = (TextView) findViewById(R.id.your_id_textview);
your_text_view.setEllipsize(TextUtils.TruncateAt.END);

xml:

android:maxLines = "5"

por exemplo

Em Mateus 13, os discípulos perguntaram a Jesus por que Ele falou à multidão em parábolas. Ele respondeu: "Foi-lhe dado conhecer os mistérios do reino dos céus, mas a eles não foi dado.

Resultado: Em Mateus 13, os discípulos perguntaram a Jesus por que Ele falou às multidões em parábolas. Ele respondeu: "Foi-lhe dado saber ...


4

Eu obtive o resultado desejado usando

android:maxLines="2"
android:minLines="2"
android:ellipsize="end"

O truque é definir maxLines e minLines com o mesmo valor ... e não apenas android: lines = "2", não o fazem. Além disso, você está evitando atributos descontinuados.


4

Você precisa adicionar as seguintes linhas ao seu layout para a visualização de texto

android:maxLines="1"
android:ellipsize="end"
android:singleLine="true"

Espero que funcione para voce.


3

Você pode limitar o número de caracteres da sua exibição de texto e adicionar (...) após o texto. Suponha que você precise mostrar apenas 5 letras e depois disso (...), faça o seguinte:

String YourString = "abcdefghijk";

if(YourString.length()>5){

YourString  =  YourString.substring(0,4)+"...";

your_text_view.setText(YourString);
}else{

 your_text_view.setText(YourString); //Dont do any change

}

um pequeno truque ^ _ ^. Embora não seja uma boa solução. Mas um trabalho em torno do qual funcionou para mim: D

EDIT: Eu adicionei cheque para menos caracteres conforme seu número limitado. de caracteres.



3

Para trabalhar com o atributo android: ellipsize , você deve limitar a largura do layout do TextView , para que o texto fique fora dos limites da visualização do TextView.

Portanto, o atributo android: layout_width desempenha um papel fundamental aqui, configure-o de acordo.

Um exemplo pode ser:

<TextView        
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:text="This is a very long text to be displayed"
    android:textSize="12sp"
    android:maxLines="1"            
     />

Agora, aqui, se o texto no android: text = "Este é um texto muito longo a ser exibido" desaparece do TextView com um android: layout_width = "120dp" , android: ellipsize = "end" truncará o texto e coloque ... (3 pontos) depois dele. isto é muito longo ... será exibido no TextView.


2

Eu acho que você dá correção altura e largura da exibição de texto. Então sua solução funcionará.


2

você pode escrever esta linha em xml, onde você seleciona textview:

android:singleLine="true"

2

A abordagem do @AzharShaikh funciona bem.

android:ellipsize="end"
android:maxLines="1"

Mas percebo um problema que o TextView será truncado por palavra (por padrão). Mostrar se temos um texto como:

teste long_line_without_any_space_abcdefgh

o TextView exibirá:

teste...

E eu encontrei uma solução para lidar com esse problema, substitua espaços pelo caractere de espaço no-break unicode, faz o TextView envolver caracteres em vez de palavras:

yourString.replace(" ", "\u00A0");

O resultado:

teste long_line_without_any_space_abc ...


2
        <TextView
            android:id="@+id/product_description"
            android:layout_width="165dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:paddingLeft="12dp"
            android:paddingRight="12dp"
            android:text="Pack of 4 summer printed pajama"
            android:textColor="#d2131c"
            android:textSize="12sp"
            android:maxLines="2"
            android:ellipsize="end"/>

1

Adicione estas duas linhas no seu texto

android:ellipsize="end"
android:singleLine="true"

0

você pode fazer isso xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />

Como posso colocar 3 Dots@ end com maxLength="35"propriedade qualquer solução?
— Sagar

-1

Você acabou de mudar ...

android:layout_width="wrap_content"

Use isto abaixo da linha

android:layout_width="match_parent"

.......

   <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:layout_marginTop="10dp"
       android:layout_toRightOf="@+id/visitBox"
       android:orientation="vertical" >

             <TextView
                  android:id="@+id/txvrequestTitle"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:singleLine="true"
                  android:text="Abcdefghighiklmnon"
                  android:textAppearance="? 
                  android:attr/textAppearanceLarge"
                  android:textColor="@color/orange_color" />

   </LinearLayout>

singleLine está obsoleto
— Nick
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.