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

Respostas:

693

Descontinuada:

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

Atualizada:

android:ellipsize="end" 
android:maxLines="1"
Mohammed Azharuddin Shaikh
fonte
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.

Suragch
fonte
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"
Niranj Patel
fonte
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"
Muz
fonte
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"
Nayanesh Gupte
fonte
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>

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

Varad Mondkar
fonte
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 ...

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

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

Mayank Bhatnagar
fonte
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.

TheLittleNaruto
fonte
Já está explicado aqui
Chapéu de Palha
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.

Androwed
fonte
2

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

Vinay Kumar Baghel
fonte
2

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

android:singleLine="true"
Jay Thakkar
fonte
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 ...

Pense duas vezes no código uma vez
fonte
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"/>
kamran rahmatullah
fonte
1

Adicione estas duas linhas no seu texto

android:ellipsize="end"
android:singleLine="true"
SANJAY GUPTA
fonte
0

você pode fazer isso xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />
Khalid Taha
fonte
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>
KeTaN
fonte
singleLine está obsoleto
Nick