web-dev-qa-db-fra.com

Ellipsize ne fonctionne pas pour textView dans listView personnalisé

J'ai un listView avec des objets personnalisés définis par la mise en page XML ci-dessous. Je veux que le textView avec l'id "info" soit ellipsé sur une seule ligne, et j'ai essayé d'utiliser les attributs 

Android:singleLine="true"
Android:ellipsize="end"

sans succès.

Si je règle layout_width sur une largeur fixe comme par ex.

Android:layout_width="100px"

le texte est tronqué bien. Mais pour des raisons de portabilité, ce n'est pas une solution acceptable.

Pouvez-vous repérer le problème?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="5px"
>
<TextView  
Android:id="@+id/destination"
Android:layout_width="fill_parent" 
Android:layout_height="wrap_content"
Android:textSize="22dp"
Android:paddingLeft="5px"
/>

<TextView  
Android:id="@+id/date"
Android:layout_width="fill_parent" 
Android:layout_height="wrap_content"
Android:textSize="15dp"
Android:paddingLeft="5px"
/>

<TableLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/info_table"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:paddingLeft="5px"
Android:paddingTop="10px" 
>
    <TableRow>
        <TextView
            Android:id="@+id/driver_label"
            Android:gravity="right"
            Android:paddingRight="5px"
            Android:text="@string/driver_label" />
        <TextView
            Android:id="@+id/driver" />
    </TableRow>
    <TableRow>
        <TextView
            Android:id="@+id/passenger_label"
            Android:gravity="right"
            Android:paddingRight="5px"
            Android:text="@string/passenger_label" />
        <TextView
            Android:id="@+id/passengers" />
    </TableRow>
    <TableRow>
        <TextView
            Android:id="@+id/info_label"
            Android:gravity="right"
            Android:paddingRight="5px" 
            Android:text="@string/info_label"/>
        <TextView
            Android:id="@+id/info"
            Android:layout_width="fill_parent"
            Android:singleLine="true"
            Android:ellipsize="end" />
    </TableRow>
</TableLayout> 

27
aspartame

Ellipsize est cassé (allez votez sur le rapport de bogue , d'autant plus qu'ils prétendent que ce n'est pas reproductible) et que vous devez utiliser un hack mineur Utilisation:

Android:inputType="text"
Android:maxLines="1"

sur tout ce que vous voulez ellipsize. Aussi, n'utilisez pas singleLine, c'est obsolète.

UPDATE:

En regardant de plus près, le problème que vous rencontrez est que votre table s’étend du côté droit de l’écran. Changer votre définition TableLayout en:

<TableLayout
    Android:id="@+id/info_table"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:paddingLeft="5px"
    Android:paddingTop="10px"
    Android:shrinkColumns="1">

devrait résoudre ce problème, alors fais ce que j'ai dit ci-dessus pour ellipsiser votre TextView.

24
Jeremy Logan

Sans utiliser les propriétés obsolètes, les lignes suivantes fonctionnent très bien pour moi

Android:ellipsize="end" 
Android:lines="1"
Android:scrollHorizontally="true"

ref http://code.google.com/p/Android/issues/detail?id=882#c9

40
tbruyelle

J'ai eu les mêmes résultats que Steve:

Android: ellipsize = "Marquee" Android: scrollHorizontally = "true" Android: lines = "1" 

marche parfaitement

7
Andy Cochrane

essayer...

c'est à dire.

Android:ellipsize="Marquee"
Android:focusable="true" Android:marqueeRepeatLimit="num|Marquee_forever"
Android:lines="1" Android:focusableInTouchMode="true"
Android:scrollHorizontally="true"

comme Marquee ne fonctionne que lorsque la vue est sélectionnée ou activée en fonction du commentaire n ° 2 sur http://code.google.com/p/Android/issues/detail?id=5364

4
hwii77

Après avoir vérifié ces 3 problèmes (fermé et ré-ouvert) et les posts précédents, je pense que la clé est de terminer TextView avec un LinearLayout externe (ou toute autre mise en page que vous utilisez) et de définir le "layout_width". _ "de largeur de mise en page externe un peu PLUS PETIT que la longueur du texte contenu dans le TextView. Semble a LIMITER la largeur pour que "Android: ellipsize" se comporte correctement.

Suivez le conseil dans ce problème , après avoir ajouté tous ces attributs pour le piratage, j'ai également défini la largeur de layout_width de LinearLayout externe à 240dp, par exemple:

<Linearlayout
  Android:layout_width="240dp"
  Android:layout_height="wrap_content"
  ...>

    <TextView
     ....
     Android:singleLine="true"
     Android:lines="1"
     Android:maxLines="1"
     Android:scrollHorizontally="true"
     Android:ellipsize="end"
     Android:text="this is a text which length should be longer than 240dp"
    />
</LinearLayout>

Alors je peux réussir à faire la fin de TextView affichant "...", pas très acceptable mais ça fonctionne! Et je pense que cela fonctionne qu'il soit utilisé dans TextView normal ou dans un TextView dans un adaptateur de liste.

Voici ma capture d'écran pour le résultat!

hope it helps ^^

Réf de ces 3 numéros:

numéro 882

numéro 10554

numéro 31229

1
Robert

J'ai trouvé quelque part cet attribut

<TextView ...
Android:singleLine="true"
Android:ellipsize="Marquee" />

ça marche bien pour moi (Android 1.5)

0
molokoloco

Pour moi, ces attributs ont fonctionné. J'ai testé sur API 8 et les versions suivantes

En XML

<TextView
 ....
 Android:maxLines="1"
 Android:scrollHorizontally="true"
 Android:ellipsize="end"
 ....
/>

Par programme

setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
0
Shan Xeeshi

Si vous placez TextView dans un groupe de vues personnalisé que vous avez créé, assurez-vous de le mesurer à nouveau si vous avez modifié la dimension après la mesure.

Par exemple, j'ai calculé la nouvelle dimension dans onLayout. Avant d'appeler child.layout, appelez 

measureChild(child,
    View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
    View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
0
Helin Wang

J'ai eu le même problème dans recycler view card. J'ai résolu ce problème en ajoutant le code suivant:

    <TextView
        Android:ellipsize="end"
        Android:maxLines="1"/>
0
Shri