Ellipsize funktioniert nicht für Textview innerhalb benutzerdefinierten Listview
Frage
Ich habe eine Listview mit benutzerdefinierten Objekten durch das xml-Layout unten definiert. Ich möchte die Textview mit der ID „info“ auf einer einzigen Zeile zu ellipsized, und ich habe versucht, die Attribute mit
android:singleLine="true"
android:ellipsize="end"
ohne Erfolg.
Wenn ich die layout_width auf eine feste Breite wie z.
android:layout_width="100px"
Der Text wird abgeschnitten, in Ordnung. Aber für diese Portabilität Gründen ist keine akzeptable Lösung.
Können Sie das Problem erkennen?
<?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>
Lösung
Ellipsize ist gebrochen (go Abstimmung über den Bug-Report , zumal sie behaupten, es ist nicht reproduzierbar), so haben Sie eine kleine Kerbe zu verwenden. Verwendung:
android:inputType="text"
android:maxLines="1"
auf alles, was Sie ellipsize wollen. Auch nicht singleLine
verwenden, es ist veraltet.
UPDATE:
Bei näherer Betrachtung das Problem, das Sie haben sind, ist, dass Ihre Tabelle auf der rechten Seite des Bildschirms erstreckt ausgeschaltet ist. Ändern Sie Ihre TableLayout
Definition:
<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">
sollte dieses Problem beheben, dann tun, was ich sagte über den TextView
ellipsize.
Andere Tipps
Ohne veraltete Eigenschaften zu verwenden, die folgenden Zeilen arbeiten gut für mich
android:ellipsize="end"
android:lines="1"
android:scrollHorizontally="true"
http://code.google.com/p / android / issues / Detail? id = 882 # c9
Ich hatte die gleichen Ergebnisse wie Steve:
Android: ellipsize = "Marquee" Android: scrollHorizontally = "true" Android: lines = "1"
funktioniert perfekt
versuchen ...
d.
android:ellipsize="marquee"
android:focusable="true" android:marqueeRepeatLimit="num|marquee_forever"
android:lines="1" android:focusableInTouchMode="true"
android:scrollHorizontally="true"
als Marquee funktioniert nur, wenn Ansicht ausgewählt ist oder fokussiert nach dem Kommentar # 2 auf http://code.google.com/p/android/issues/detail?id=5364
Nach dem Auschecken dieser 3 Ausgaben (geschlossen und wieder geöffnet) und früheren Posts, ich glaube, der Schlüssel Textview mit einem äußeren Linearlayout einpacken ist (oder ein anderes Layout Sie verwenden), und stellen Sie den „ layout_width “des äußeren Layouts Breite ein wenig kLEINE als die Textlänge im Textview enthalten ist. Es scheint, muss LIMIT die Breite der machen "android: ellipsize". Verhalten sich richtig
, um die Spitze in dieser Ausgabe Folgen, nachdem Sie all diese Attribute für Hacker, habe ich zum Beispiel auch die layout_width von äußeren Linearlayout 240dp:
<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>
Als ich erfolgreich das Ende der Textview-Anzeigen machen „...“, nicht sehr akzeptabel, aber es funktioniert! Und ich denke, es ist, ob in regelmäßigen Textview oder einen Textview in einer Liste Adapter verwendet funktioniert.
Hier ist mein Screenshot für das Ergebnis!
Ref dieser drei Probleme:
Ich fand irgendwo diese Attribute
<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />
es funktioniert für mich (Android 1.5)
Für mich dieses Attribut gearbeitet. Getestet habe ich auf API 8 und ab
In XML
<TextView
....
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
....
/>
Programmatically
setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
Wenn Sie Textview in einem benutzerdefinierten setzen Viewgroup Sie erstellt haben, stellen Sie sicher, es erneut zu messen, ob Sie die Dimension nach der Messung geändert.
z. B. habe ich die neue Dimension in onLayout- berechnet. Bevor Sie child.layout rufen, rufen Sie
measureChild(child,
View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
Ich hatte das gleiche Problem in Recycler View-Karte. Ich habe beschlossen, dies durch folgenden Code hinzu:
<TextView
android:ellipsize="end"
android:maxLines="1"/>