Android, comment limiter la largeur de TextView (et ajouter trois points à la fin du texte)?


317

J'ai un TextViewque je veux limiter les caractères de celui-ci. En fait, je peux le faire mais la chose que je cherche, c'est comment ajouter trois points (...) à la fin de la chaîne. Celui-ci montre que le texte a continué. Ceci est mon XML mais il n'y a pas de points bien qu'il limite mon texte.

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

Réponses:


693

Obsolète:

Ajoutez une propriété supplémentaire android:singleLine="true"dans votre Textview

Actualisé:

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

3
J'ai vraiment besoin de singleLine quand je viens de tenter cela. Même s'il est dit obsolète.
EGHDK

41
android: singleLine = "true" est déconseillé et a de mauvais effets secondaires. utilisez plutôt android: ellipsize = "end" et maxLine = "1"
Hamidreza Hosseinkhani

1
Quels sont les "mauvais effets secondaires" de l'utilisation singleLine? Voir aussi: L'attribut xml singleLine est-il obsolète ou non dans Android?
Suragch

1
btw, android: maxLines peut être supérieur à 1 si vous le souhaitez :)
Touré Holder

1
Quelqu'un at-il ce msg "W / StaticLayout: maxLineHeight ne doit pas être -1. MaxLines: 1 lineCount: 1">?
COLD ICE

157

Ce qui suit est ce que j'ai appris en jouant avec différentes options pour forcer un TextViewà une seule ligne (avec et sans les trois points).

entrez la description de l'image ici

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

Cela force simplement le texte à une ligne. Tout texte supplémentaire est masqué.

En relation:

ellipsize = "fin"

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

Cela coupe le texte qui ne tient pas, mais permet aux utilisateurs de savoir que le texte a été tronqué en ajoutant des points de suspension (les trois points).

En relation:

ellipsize = "chapiteau"

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

Cela fait défiler le texte automatiquement à travers TextView. Notez que parfois, il doit être défini dans le code:

textView.setSelected(true);

Soi android:maxLines="1"- disant et android:singleLine="true"devrait faire essentiellement la même chose et comme singleLine est apparemment obsolète, je préférerais ne pas l'utiliser, mais quand je le retire, le chapiteau ne défile plus. Le fait de maxLinessortir ne l'affecte cependant pas.

En relation:

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

Cela permet à l'utilisateur de faire défiler manuellement pour voir toute la ligne de texte.


Mais cela ne fait qu'ellipser à la fin de chaque mot. Existe-t-il un moyen d'ajouter ... au milieu d'un très_long_word_without_whitespace ...?
Tobias Reich du

@TobiasReich, je ne connais pas de méthode intégrée pour y parvenir. Vous pouvez créer le vôtre en utilisant Paint.measureText .
Suragch

Parfois, vous pourriez avoir besoin de l'application: layout_constrainedWidth = "true" également
Dan Crisan

80

Essayez cette propriété de TextView dans votre fichier de mise en page.

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

31

Je suppose que vous voulez limiter la largeur à une ligne et non la limiter par caractère? Depuis singleLineest obsolète, vous pouvez essayer d'utiliser les éléments suivants ensemble:

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

13

par exemple. vous pouvez utiliser

android:maxLength="13"

cela limitera la longueur de texview à 13 mais le problème est que si vous essayez d'ajouter 3 points (...), il ne l'affichera pas, car il fera partie de la longueur de textview.

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

     } else {

            userName = data;

    }
        textView.setText(userName);

en dehors de cela, vous devez utiliser

 android:maxLines="1"

2
Vous devriez mieux utiliser "\ u2026" au lieu de "..."
Zharro

ce n'était qu'un exemple. si je mets des chaînes dans Strings.xml, je choisis définitivement les unicodes. Une raison précise que vous souhaitez mettre ici?
Nayanesh Gupte


6

Utilisation

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

Voilà à quoi TextViewressemble mon look:

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

Image de <code> TextView </code>


5

J'utilise Horizonal Recyclerview.
1) Ici, dans CardView, TextView est déformé verticalement lors de l'utilisation

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

Consultez le groupe TextViews Wyman en gras, Jaskolski ... entrez la description de l'image ici

2) Mais quand j'ai utilisé singleLine avec ellipsize -

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

Consultez le groupe TextViews Wyman en gras, Jaskolski ... entrez la description de l'image ici

La 2ème solution a fonctionné correctement pour moi (en utilisant singleLine). J'ai également testé dans la version OS: 4.1 et supérieure (jusqu'à 8.0), cela fonctionne bien sans aucun plantage.


4

code:

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

xml:

android:maxLines = "5"

par exemple

Dans Matthieu 13, les disciples ont demandé à Jésus pourquoi il parlait à la foule en paraboles. Il répondit: "Il vous a été donné de connaître les mystères du royaume des cieux, mais il ne leur a pas été donné.

Résultat: Dans Matthieu 13, les disciples ont demandé à Jésus pourquoi il parlait à la foule en paraboles. Il a répondu: "Il vous a été donné de savoir ...


4

J'ai obtenu le résultat souhaité en utilisant

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

L'astuce est de définir maxLines et minLines à la même valeur ... et pas seulement android: lines = "2", ne font pas l'affaire. Vous évitez également les attributs obsolètes.


4

Vous devez ajouter les lignes suivantes dans votre mise en page pour l'affichage du texte

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

J'espère que cela fonctionne pour toi.


3

Vous pouvez limiter le nombre de caractères de votre affichage de texte et ajouter (...) après le texte. Supposons que vous ne deviez afficher que 5 lettres et que vous deviez ensuite montrer (...), procédez comme suit:

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

}

un petit hack ^ _ ^. Bien que ce ne soit pas une bonne solution. Mais un travail autour qui a fonctionné pour moi: D

EDIT: J'ai ajouté une vérification pour moins de caractère selon votre numéro limité. de personnages.



3

Pour travailler avec l' attribut android: ellipsize , vous devez limiter la largeur de mise en page de TextView , de sorte que le texte soit hors limites de la vue de TextView.

Ainsi, l' attribut android: layout_width joue un rôle clé ici, définissez-le en conséquence.

Un exemple peut être:

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

Maintenant, ici, si le texte dans android: text = "Ceci est un texte très long à afficher" disparaît de TextView avec un android: layout_width = "120dp" , android: ellipsize = "end" tronquera le texte et placer ... (3 points) après. c'est-à-dire que c'est très long ... sera affiché dans TextView.


2

Je pense que vous donnez une hauteur et une largeur fixes de la vue texte. Ensuite, votre solution fonctionnera.


2

vous pouvez écrire cette ligne en xml où vous prenez textview:

android:singleLine="true"

2

L'approche de @AzharShaikh fonctionne bien.

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

Mais je réalise un problème que TextView sera tronqué par mot (par défaut). Montrez si nous avons un texte comme:

test long_line_without_any_space_abcdefgh

TextView affichera:

tester...

Et j'ai trouvé une solution pour gérer ce problème, remplacer les espaces par le caractère d'espace insécable unicode, il fait envelopper TextView sur les caractères plutôt que sur les mots:

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

Le résultat:

test 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

Ajoutez ces deux lignes dans votre texte

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

0

vous pouvez le faire en xml:

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

Comment puis-je mettre 3 Dots@ end avec maxLength="35"propriété toute solution?
Sagar

-1

Vous changez juste ...

android:layout_width="wrap_content"

Utilisez cette ligne ci-dessous

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 obsolète
Nick
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.