Comment habiller du texte dans TextView sous Android


86

Est-ce que quelqu'un sait comment envelopper du texte dans TextView sur la plate-forme Android. c'est-à-dire que si le texte dans Textview dépasse la longueur de l'écran, il doit être affiché sur la deuxième ligne.

J'ai recherché et essayé ce qui suit:

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

Mais aucun ne fonctionne.

Quelqu'un peut-il suggérer comment puis-je le faire.


7
TextViews doit être renvoyé à la ligne par défaut. Pouvez-vous publier votre mise en page entière?
danh32

Par hasard, le Textview est-il dans une mise en page de tableau? Si c'est le cas, j'ai une réponse pour vous.
JohnFx

1
Dans mon cas, après avoir ajouté environ une demi-douzaine d'attributs (décrits ci-dessous) pour forcer la vue de texte à envelopper le texte sur plusieurs lignes, sans succès, j'ai remarqué que j'avais un attribut android:inputType="textPersonName". Apparemment, il avait été ajouté par l'outil de conception Android Studio. La suppression de cet attribut a résolu le problème! Il peut y avoir d'autres types d'entrée qui empêchent également l'encapsulation.
LarsH

Réponses:


56

Pour moi, ce problème ne s'est produit que sur Android <4.0

La combinaison de paramètres que j'ai utilisée était:

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

Le nombre maxLines semblait être le dernier élément aléatoire qui a rendu mon habillage TextView.


9
Je sais que c'est un vieux fil maintenant, mais je pensais que je publierais mes conclusions. J'ai utilisé uniquement «android: maxLines», puis il a enveloppé mon texte. Cheer @Guykun
StuStirling

Encore une fois, cela revient à définir simplement la hauteur de TextView à match_parent, ce qui n'est pas la même chose que d'agrandir la hauteur de TextView pour inclure les lignes supplémentaires.
SMBiggs

50

Disposition des contraintes

<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"/>
  • Assurez-vous que la largeur de votre mise en page est égale à zéro
  • les contraintes gauche / droite sont définies
  • La hauteur de disposition de wrap_content permet une expansion vers le haut / bas.
  • Défini android:maxLines="2"pour empêcher l'expansion verticale (2 est juste un exemple)
  • Les ellipses sont probables. une bonne idée avec des lignes maxandroid:ellipsize="end"

La largeur 0dp permet aux contraintes gauche / droite de déterminer la largeur de votre widget.

La définition de contraintes gauche / droite définit la largeur réelle de votre widget, dans laquelle votre texte sera enveloppé.

Documents sur la mise en page des contraintes


Oui! C'est exactement comme ça que ça marche! Assurez-vous simplement de régler la largeur sur 0dp
Yoraco Gonzales

définir les contraintes de gauche et de droite m'a aidé à l'envelopper, au lieu que le texte déborde au-delà des limites de droite
Jia Tse

31

Pour le cas où le TextViewest à l'intérieur de a TableLayout, la solution est de définir android:shrinkColumns="1"sur le TableLayout. (Remplacez 1par le numéro de colonne dans laquelle se trouve TextView que vous souhaitez envelopper. (Indexé 0))

AFAICT, aucun autre attribut n'est nécessaire sur le TextView.

Pour les autres cas, voir les autres réponses ici.

FWIW, j'avais initialement réussi à travailler avec

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

mais cela a abouti à un espace vide supplémentaire au bas du dialogue dans lequel tout était.


C'était ce que je cherchais! Sinon mes mots sont coupés
Carson Holzheimer

12

Vous devez utiliser 2 paramètres:

  • android:ellipsize="none" : le texte n'est pas coupé sur la largeur de la vue du texte

  • android:scrollHorizontally="false" le texte s'enroule sur autant de lignes que nécessaire


5
Cela ne fonctionne pas pour moi. (FWIW, j'ai un TextView dans un TableRow dans un TableLayout.)
aij

8

À utiliser app:breakStrategy="simple"dans AppCompatTextView, il contrôlera la mise en page des paragraphes.

Il a trois valeurs constantes

  • équilibré
  • haute qualité
  • Facile

Conception dans votre XML TextView

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

Si votre niveau d'API minimum actuel est de 23 ou plus, alors dans Codage

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

Pour plus d'informations, reportez-vous à cette BreakStrategy

Image de stratégie


7

Cela devrait résoudre votre problème: android:layout_weight="1".


Cela provoque simplement l'expansion de TextView pour prendre autant d'espace que possible, ce qui revient à définir la hauteur sur match_parent. Pas tout à fait la même chose que voulait OP.
SMBiggs

1
Dans le cas de TableLayout, j'ai layout_weight="1"résolu le problème. Cependant, mon TableRow qui contient le TextView avait layout_heightdéfini une valeur spécifique. Peut-être sera utile pour quelqu'un
kit du

5

OK les gars, la vérité est quelque part au milieu parce que vous devez voir le problème du point de vue du parent et de l'enfant. La solution ci-dessous fonctionne UNIQUEMENT lorsque le mode spinner = dialogquelle que soit la version d'Android (pas de problème là-bas .. testé dans VD et DesireS avec Android => 2.2):

  1. . Réglez le mode de votre spinner (le parent) comme:

    android:spinnerMode="dialog"  
    
  2. Définissez les propriétés de textview (vue personnalisée enfant) sur:

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

J'espère que cela fonctionne pour vous aussi.


J'ai essayé tellement de choses pour le faire fonctionner en mode «déroulant» mais rien n'a fonctionné. Maintenant installé en mode «dialogue».
Mangesh

4

En définissant android:maxEmsune valeur donnée avec android:layout_weight="1", le TextView s'emballe une fois qu'il atteint la longueur donnée de l'ems.


Fonctionne également pour TextView placé dans RelativeLayout.
ayz4sci

ont été à la recherche pendant des heures, merci, cela fonctionne très bien sur constraintLayout aussi
TarekB

3

Dans Android Studio 2.2.3, sous la inputTypepropriété, il y a une propriété appelée textMultiLine. La sélection de cette option a résolu un problème similaire pour moi. J'espère que cela aide.


2
Ceci est pour EditText, pas Textview
PsychedelicSubstance

2

Je travaillais juste sur un TextView dans une disposition à l'intérieur d'un RecyclerView. J'avais texte se couper, ex, pour Read this message, j'ai vu: Read this. J'ai essayé de configurer android:maxLines="2"le TextView, mais rien n'a changé. Cependant, a android:lines="2"abouti Read thissur la première ligne et messagesur la 2ème.


1

J'ai eu le même problème. Suite au changement, cela a fonctionné -

android:layout_width="wrap_content"

Les points de suspension, maxLines ou layout_weight - tout cela ne faisait aucune différence. Remarque - La largeur du parent est également définie comme wrap_content.


1

Tout ce que vous avez à faire est de définir la largeur de votre texte .

android: layout_width = "60dp"

vous pouvez changer la largeur de votre choix. Tapez simplement une longue phrase pour vérifier si cela fonctionne comme ça

android: text = "je veux faire partie des ingénieurs logiciels de classe mondiale"


1

Essayez l'approche de @ Guykun

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

Assurez-vous également que la largeur des parents n'est pas définie pour envelopper le contenu. C'est la chose qui me manquait.


0

J'utilise Android 2.2 et ma vue de texte passera automatiquement à la ligne suivante si elle dépasse l'écran.

Si vous souhaitez que le texte passe à la ligne suivante avant la fin de l'écran, ajoutez simplement (indiquez simplement votre propre valeur dp). Cela sera utile si vous avez une image à droite du texte.

android:layout_marginRight="52dp"

0

Assez étrange - j'ai créé mon TextView dans Code et il a été enveloppé - bien que je ne définisse rien d'autre que des éléments standard - mais voyez par vous-même:

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

Comme vous pouvez le voir dans la définition des paramètres, j'utilise un LinearLayout. La classe Label étend simplement TextView - ne rien faire à part définir la taille et la couleur de la police.

Lors de son exécution dans l'émulateur (niveau d'API 9), il enveloppe automatiquement le texte sur 3 lignes.


Notez l'utilisation de ce code LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);. Il est fort probable que le wrapping que vous considérez comme "automagique"
nemesisfixx

0

Il suffit de définir layout_withune taille définie , lorsque le texte remplit la largeur maximale, il débordera sur la ligne suivante, provoquant un effet d'enroulement.

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

0

L'astuce est avec la largeur textView, essayez de lui faire un numéro dédié comme:

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

J'ai essayé de nombreuses solutions sans aucun résultat, j'ai essayé:

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

la seule chose qui a déclenché l'option wrap est la largeur dédiée


-1

Vous devez ajouter votre TextView dans un ScrollView avec quelque chose comme ceci:

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

4
Merci pour votre réponse Mais mon objectif est d'envelopper le texte lorsqu'il dépasse la longueur de la ligne pour ne pas mettre de scroller horizontal.
Sameer
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.