Ellipsize not working for textView inside custom listView
Question
I have a listView with custom objects defined by the xml-layout below. I want the textView with id "info" to be ellipsized on a single line, and I've tried using the attributes
android:singleLine="true"
android:ellipsize="end"
without success.
If I set the layout_width to a fixed width like e.g.
android:layout_width="100px"
the text is truncated fine. But for portability reasons this is not an acceptable solution.
Can you spot the problem?
<?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>
Solution
Ellipsize is broken (go vote on the bug report, especially since they claim it's not reproducible) so you have to use a minor hack. Use:
android:inputType="text"
android:maxLines="1"
on anything you want to ellipsize. Also, don't use singleLine
, it's been deprecated.
UPDATE:
On closer inspection, the problem you're having is that your table is extending off the right side of the screen. Changing your TableLayout
definition to:
<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">
should fix that problem, then do what I said above to ellipsize your TextView
.
OTHER TIPS
Without using deprecated properties, the following lines work great for me
android:ellipsize="end"
android:lines="1"
android:scrollHorizontally="true"
ref http://code.google.com/p/android/issues/detail?id=882#c9
I had the same results as Steve:
android:ellipsize="marquee" android:scrollHorizontally="true" android:lines="1"
works perfectly
try...
i.e.
android:ellipsize="marquee"
android:focusable="true" android:marqueeRepeatLimit="num|marquee_forever"
android:lines="1" android:focusableInTouchMode="true"
android:scrollHorizontally="true"
as marquee only works when view is selected or focused according to the comment#2 on http://code.google.com/p/android/issues/detail?id=5364
After checking out these 3 issues(closed & re-opened) and previous posts, I think the key is to wrap up TextView with a outer LinearLayout(or any other layout you are using), and set the "layout_width" of outer layout width a little bit SMALLER than the text length contained in the TextView. Seems has to LIMIT the width to make the "android:ellipsize" behave properly.
Follow the tip in this issue, after adding all these attributes for hacking, I also set the layout_width of outer LinearLayout to 240dp for example:
<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>
Than I can successfully make the end of TextView displaying "...", not very acceptable but it works! And I think it works whether used in regular TextView or a TextView in a List Adapter.
Here's my screenshot for the result!
Ref of those 3 issues:
I found somewhere this attributes
<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />
it work fine for me (Android 1.5)
For me these attribute worked. I tested on API 8 and onwards
In XML
<TextView
....
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
....
/>
Programmatically
setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
If you put TextView inside a custom ViewGroup you created, make sure to measure it again if you changed the dimension after the measurement.
E.g., I calculated the new dimension in onLayout. Before you call child.layout, call
measureChild(child,
View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
I had the same problem in recycler view card. I have resolved this by adding following code:
<TextView
android:ellipsize="end"
android:maxLines="1"/>