Ellipsize 不适用于自定义 listView 内的 textView
题
我有一个 listView ,其中包含由下面的 xml 布局定义的自定义对象。我希望 id 为“info”的 textView 在一行上省略,并且我尝试使用属性
android:singleLine="true"
android:ellipsize="end"
没有成功。
如果我将布局宽度设置为固定宽度,例如
android:layout_width="100px"
文本被截断得很好。但出于可移植性的原因,这不是一个可接受的解决方案。
你能找出问题所在吗?
<?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>
解决方案
Ellipsize已损坏(请对错误报告进行投票 ,特别是因为他们声称它不可复制)所以你必须使用一个小的黑客。使用:
android:inputType="text"
android:maxLines="1"
关于你想要的任何东西。另外,不要使用 singleLine
,它已被弃用。
<强>更新强>
仔细观察后,您遇到的问题是您的桌子正在屏幕右侧延伸。将 TableLayout
定义更改为:
<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">
应该解决这个问题,然后按照我上面所说的方式来解决你的 TextView
。
其他提示
如果不使用已弃用的属性,以下行对我来说非常有用
android:ellipsize="end"
android:lines="1"
android:scrollHorizontally="true"
我得到了与史蒂夫相同的结果:
android:椭圆机=“ marquee” android:scrollhorizontally =“ true” android:lines =“ 1”
完美运作
尝试...
即
android:ellipsize="marquee"
android:focusable="true" android:marqueeRepeatLimit="num|marquee_forever"
android:lines="1" android:focusableInTouchMode="true"
android:scrollHorizontally="true"
因为只有在根据 http://code.google.com/p/android/issues/detail?id=5364
在查看这3个问题(关闭和重新打开)和之前的帖子后,我认为关键是用外部LinearLayout(或您正在使用的任何其他布局)包装TextView,并设置“<强> layout_width 强>&QUOT;外部布局宽度比TextView中包含的文本长度稍微 SMALLER 。似乎必须 LIMIT 宽度来制作“android:ellipsize”表现得很好。
按照此问题中的提示进行操作,在为hacking添加所有这些属性之后,我还将外部LinearLayout的layout_width设置为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>
我可以成功地使TextView结束显示“...”,不是很容易接受,但它有效!我认为它适用于常规TextView或List Adapter中的TextView。
这是我的结果屏幕截图!
参考这三个问题:
我找到了这个属性的地方
<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />
它对我来说很好(Android 1.5)
对我来说,这些属性起作用了。我在API 8及其后续测试
在XML
中<TextView
....
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
....
/>
编程
setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
如果将TextView放在您创建的自定义ViewGroup中,请确保在测量后更改尺寸时再次测量它。
例如,我计算了onLayout中的新维度。在你打电话给child.layout之前,请致电
measureChild(child,
View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
我在回收商视图卡中遇到了同样的问题。我通过添加以下代码解决了这个问题:
<TextView
android:ellipsize="end"
android:maxLines="1"/>