web-dev-qa-db-fra.com

Android TextView Le texte n'est pas emballé

Quelqu'un peut-il me dire ce qui ne va pas avec le texte? Un texte de plus d'une ligne ne passe pas à la ligne suivante, mais dépasse l'écran.

Voici le code:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" 
    Android:layout_height="wrap_content"
    Android:orientation="horizontal" 
    Android:padding="4dip">

    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent" 
        Android:layout_height="wrap_content"
        Android:orientation="vertical" 
        Android:padding="4dip">

        <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="fill_parent" 
            Android:layout_height="wrap_content"
            Android:orientation="horizontal" 
            Android:padding="4dip">
            <TextView 
                Android:id="@+id/reviewItemEntityName"
                Android:layout_width="wrap_content" 
                Android:layout_height="wrap_content"
                Android:text="event/venue" 
                Android:textColor="@color/maroon"
                Android:singleLine="true" 
                Android:ellipsize="end" 
                Android:textSize="14sp"
                Android:textStyle="bold" 
                Android:layout_weight="1" />

            <ImageView 
                Android:id="@+id/reviewItemStarRating"
                Android:layout_width="wrap_content" 
                Android:layout_height="wrap_content"
                Android:layout_alignParentTop="true"
                Android:layout_alignParentBottom="true"
                Android:src="@drawable/title_1_star" />
        </LinearLayout>

        <TextView 
            Android:id="@+id/reviewItemDescription"
            Android:layout_width="fill_parent" 
            Android:layout_height="wrap_content"
            Android:text="Description comes here" 
            Android:textSize="12sp" 
            Android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>
73
d-man

Je l'ai corrigé moi-même, la clé est Android:width="0dip"

<LinearLayout 
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:padding="4dip"
    Android:layout_weight="1">

    <LinearLayout 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"
        Android:padding="4dip">

        <TextView
            Android:id="@+id/reviewItemEntityName"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="@color/maroon"
            Android:singleLine="true"
            Android:ellipsize="end"
            Android:textSize="14sp"
            Android:textStyle="bold"
            Android:layout_weight="1" />

        <ImageView
            Android:id="@+id/reviewItemStarRating"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentTop="true"
            Android:layout_alignParentBottom="true" />
        </LinearLayout>

        <TextView
            Android:id="@+id/reviewItemDescription"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:textSize="12sp"
            Android:width="0dip" />

    </LinearLayout>

    <ImageView
        Android:id="@+id/widget01"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/arrow_nxt"
        Android:layout_gravity="center_vertical"
        Android:paddingRight="5dip" />

</LinearLayout> 

75
d-man

La seule réponse correcte à cette question est que vous devez définir une largeur appropriée pour les parents (dans ce cas, FILL_PARENT, WRAP_CONTENT) et utiliser Android:layout_weight=1 pour la vue de texte à emballer. 

SingleLine est activé par défaut, cela n'entraînera aucun changement. 

Une variable width définie sur 0px fonctionnera, mais ce n'est pas une bonne solution.

Quelques exemples (dans une table cette fois-ci), en utilisant XML:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" Android:layout_height="fill_parent"
    Android:orientation="vertical">
    <TableLayout Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" Android:stretchColumns="*"
        Android:id="@+id/tableLayout1">
        <TableRow Android:id="@+id/tableRow1" Android:layout_width="fill_parent"
            Android:layout_height="wrap_content">
            <TextView Android:text="test1" Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" Android:layout_weight="0" />
            <TextView Android:layout_weight="1"
                Android:text="test2 very long text that needs to be wrapped properly using layout_weight property and ignoring singleline since that is set by default..."
                Android:layout_width="fill_parent" Android:layout_height="wrap_content" />
        </TableRow>     
    </TableLayout>
</LinearLayout>

Si vous voulez définir ceci dans le code, vous recherchez le poids de layout_weight comme troisième paramètre, comme dans cet exemple où il est défini sur 1:

row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
TextView label = new TextView(getApplicationContext());
label.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT, 1f));
40
hcpl

Vous devez utiliser 2 paramètres:

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

  • Android:scrollHorizontally="false" le texte se termine sur autant de lignes que nécessaire

19
Kartaguez

Il suffit de l'utiliser dans votre fichier XML.

Android:singleLine="false".

J'espère que ça va marcher.

Bonne chance!

12
Dhasneem

Je ne pouvais obtenir aucune de ces solutions en utilisant un TableLayout>TableRow>TextView. J'ai alors trouvé TableLayout.shrinkColumns="*". La seule autre solution qui a fonctionné a été de forcer TextView à layout_width:250px etc., mais je n'aime pas forcer les largeurs de ce type.

Essayez quelque chose comme ceci si vous travaillez avec des tables.

            <TableLayout 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:shrinkColumns="*">

Notez que vous avez besoin de shrinkColumns="*"

Ceci est évidemment dans un <LinearLayout>. Donc quelque chose comme <LinearLayout> <TableLayout> <TableRow> <TextView>

références:

TableLayout

http://code.google.com/p/Android/issues/detail?id=4000

J'espère que ça aide quelqu'un.

10
wired00

L'un de vos paramètres de présentation est incorrect dans votre code. Dans le premier TextView 

Android:layout_width="wrap_content"

changer à

Android:layout_width="fill_parent" 

Le texte qui dépasse la largeur de l'écran sera renvoyé à la ligne suivante et définit Android:singleline="false".

4
user244561

Définissez la hauteur de la vue texte Android:minHeight="some pixes" ou Android:width="some pixels". Cela résoudra le problème.

3
Chandra

Dans mon cas, supprimer le type d'entrée a fait l'affaire, j'utilisais Android: inputType = "textPostalAddress" car mon textview était collé sur une ligne et ne recouvrait pas, supprimant le problème résolu.

3
iBabur

Je suis un débutant sur Android (et l'interface graphique), mais j'ai beaucoup d'expérience avec les logiciels. J'ai suivi quelques tutoriels, et voici ce que j'ai compris:

layout_width et layout_height sont des attributs de TextView. Ce sont des instructions sur la manière dont TextView doit se former, elles ne font pas référence à la façon de gérer le contenu dans TextView.

Si vous utilisez "fill_parent", vous dites que le TextView doit se modeler par rapport à sa vue parent, il doit le remplir.

Si vous utilisez "wrap_content", vous dites que vous devez ignorer la vue parent et laisser le contenu de TextView définir sa forme.

Je pense que c'est le point de confusion. "wrap_content" n'indique pas à TextView comment gérer son contenu (pour envelopper les lignes), il lui indique qu'il doit se conformer par rapport à son contenu. Dans ce cas, sans caractères de nouvelle ligne, il se forme de manière à ce que tout le texte soit sur une seule ligne (ce qui malheureusement déborde du parent).

Je pense que vous voulez qu'il remplisse le parent horizontalement et que son contenu soit enveloppé verticalement.

2
Ben Horner

J'ai eu un problème similaire où mes deux TextViews à pondération horizontale n'ont pas enveloppé le texte. J'ai découvert par la suite que le problème était dû au fait que mon parent de viewparents avait wrap_content au lieu de match_parent.

1
Supahfly

Augmentez la hauteur, c'est-à-dire .. Android: height = "Une certaine taille", cela fonctionne très bien pour moi.

1
Phani varma

Même s'il s'agit d'un vieux fil, je voudrais partager mon expérience, car cela m'a aidé. Mon application fonctionnait correctement pour OS 2.0 et 4.0+, mais pour un téléphone HTC fonctionnant sous OS 3.x, le texte n'était pas enveloppé. Ce qui a fonctionné pour moi a été d'inclure ces deux balises. 

Android:maxLines="100"
Android:scrollHorizontally="false"

Si vous éliminez l'un ou l'autre, cela ne fonctionnait pas uniquement pour le périphérique os 3.0. Le paramètre "ellipsize" a un effet neutre. Voici la balise textview complète ci-dessous 

<TextView
                Android:id="@+id/cell_description"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:paddingTop="5dp"
                Android:maxLines="100"
                Android:scrollHorizontally="false"
                Android:textStyle="normal"
                Android:textSize="11sp"
                Android:textColor="@color/listcell_detail"/>

J'espère que cela aiderait quelqu'un. 

1
nsuinteger

J'ai passé des heures à comprendre que dans le texte que j'essayais d'afficher contenait un guillemet simple (dans string.xml), je l'ai donc échappé avec une barre oblique inversée et cela fonctionnait bien => la hauteur du TextView était correctement le texte enveloppant: 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:paddingLeft="16dp"
    Android:paddingRight="16dp"
    Android:paddingTop="16dp"
    tools:context=".MainActivity">

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:fontFamily="sans-serif-smallcaps"
        Android:text="@string/instructions"
        Android:textAlignment="center"
        Android:textSize="18sp"
        Android:textStyle="bold" />

    <EditText
        Android:id="@+id/keyword"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/defaultKeyword"
        Android:textSize="22sp"
        />
0
smasper

Je mets cet attribut:

Android:inputType="textMultiLine"

dans ma TextView et il a une ligne d'habillage et l'utilisateur peut "entrer" pour une nouvelle ligne. 

=============================================== ==========

Lorsque vous arriverez à ce message, vous voudrez peut-être créer un Big TextView pouvant afficher plusieurs lignes. Ces attributs peuvent donc également être nécessaires.

Android:layout_height="Xdp" //where X is a number depends on how big Textview you want
Android:gravity="top" //in order to make your text start from the top of your TextView.
0
Linh Lino

Je viens de supprimer Android:lines="1" et d’ajouter Android:maxLines="2", le texte s’enroule automatiquement. Le problème était l'attribut Android:lines. Cela fait en sorte que le texte soit pas arrive.

Je n'ai pas eu à utiliser maxEms ou singleLine="false" (API obsolète) pour résoudre ce problème.

0
Siddharth

Je sais que le problème est exact, mais dans mon cas, le problème était de définir la propriété textSize dans "dp" - je l’ai changée en "sp" et cela fonctionne bien.

0
Krystian

J'ai utilisé Android:ems="23" pour résoudre mon problème. Il suffit de remplacer 23 par la meilleure valeur dans votre cas.

<TextView
        Android:id="@+id/msg"
        Android:ems="23"
        Android:text="ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab "
        Android:textColor="@color/white"
        Android:textStyle="bold"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>
0
Beto Caldas

vous devez utiliser Android:singleLine="false" dans vos balises TextView.

0
Praveen

J'utilise la mise en page de contrainte principalement.

1) Android:layout_width="match_parent" = essaye de s'étirer pour rencontrer les bords

2) Android:layout_width="wrap_content" = uniquement basé sur le texte saisi, sans égard aux autres vues à proximité. par exemple, ajouter Android:textAlignment="center" changera la forme du texte

3) Android:padding="12dp" Android:layout_width="0dp" Android:layout_weight="1" Android:singleLine="false" 

= Le texte se pliera pour s'adapter aux mises en page proches sans tenir compte du texte lui-même

0
cagney

Je pense que cela dépend de la combinaison particulière de dispositions dans votre affichage. Certains drapeaux peuvent être remplacés ou ignorés. J'ai un TabHost avec des onglets, chaque onglet est une liste de tables. Il s’agit donc d’un onglet de ListView, chaque ligne étant un TableLayout de TextView J'ai essayé les correctifs énumérés ci-dessus et aucun d'entre eux n'a fonctionné.

0
likejudo

J'ai finalement réussi à ajouter quelques pixels à la hauteur du TextView pour résoudre ce problème.

Vous devez d’abord obtenir la hauteur de TextView. Ce n'est pas simple car c'est 0 avant que cela soit déjà peint.

Ajoutez ce code à onCreate:

mReceiveInfoTextView = (TextView) findViewById(R.id.receive_info_txt);
if (mReceiveInfoTextView != null) { 
    final ViewTreeObserver observer = mReceiveInfoTextView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = mReceiveInfoTextView.getHeight();
            int addHeight = getResources().getDimensionPixelSize(R.dimen.view_add_height);
            mReceiveInfoTextView.setHeight(height + addHeight);

            // Remove the listener if possible
            ViewTreeObserver viewTreeObserver = mReceiveInfoTextView.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

Vous devez ajouter cette ligne à dimens.xml

<dimen name="view_add_height">10dp</dimen>

J'espère que ça aide.

0
crubio

Dans mon cas, avec une imbrication TableRow > ScrollView > TextView, j'ai résolu le problème en définissant Android:layout_width sur fill_parent sur TableRow et sur wrap_content sur ScrollView et TextView.

0
Janaka Bandara

J'ai ajouté un\n au milieu de ma chaîne et ça avait l'air d'aller.

0
Yusuf X