Ellipsize 不适用于自定义 listView 中的 textView
Posted
技术标签:
【中文标题】Ellipsize 不适用于自定义 listView 中的 textView【英文标题】:Ellipsize not working for textView inside custom listView 【发布时间】:2010-11-28 07:10:15 【问题描述】:我有一个列表视图,其中包含由下面的 xml 布局定义的自定义对象。我希望 id 为“info”的 textView 在一行上被省略,我尝试使用属性
android:singleLine="true"
android:ellipsize="end"
没有成功。
如果我将 layout_width 设置为固定宽度,例如
android:layout_
文本被截断了。但出于便携性原因,这不是一个可接受的解决方案。
你能发现问题吗?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_
android:paddingBottom="5px"
>
<TextView
android:id="@+id/destination"
android:layout_
android:layout_
android:textSize="22dp"
android:paddingLeft="5px"
/>
<TextView
android:id="@+id/date"
android:layout_
android:layout_
android:textSize="15dp"
android:paddingLeft="5px"
/>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/info_table"
android:layout_
android:layout_
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_
android:singleLine="true"
android:ellipsize="end" />
</TableRow>
</TableLayout>
【问题讨论】:
【参考方案1】:如果不使用已弃用的属性,以下几行对我很有用
android:ellipsize="end"
android:lines="1"
android:scrollHorizontally="true"
参考http://code.google.com/p/android/issues/detail?id=882#c9
【讨论】:
即使没有线条,ellipsize 似乎也只适用于 scrollHorizontally 设置。 它不适用于 Android 4.0。使用 i 代替上面的代码:android:ellipsize="end" android:SingleLine="true" android:scrollHorizontally="true"
Android Studio 说 android:singleLine 已被弃用,它仍然需要 android:ellipsize 才能工作【参考方案2】:
Ellipsize 坏了(去vote on the bug report,特别是因为他们声称它不可重现)所以你必须使用一个小技巧。使用:
android:inputType="text"
android:maxLines="1"
在任何你想省略的地方。另外,不要使用singleLine
,它已被弃用。
更新:
仔细检查后,您遇到的问题是您的桌子超出了屏幕的右侧。将您的 TableLayout
定义更改为:
<TableLayout
android:id="@+id/info_table"
android:layout_
android:layout_
android:paddingLeft="5px"
android:paddingTop="10px"
android:shrinkColumns="1">
应该解决这个问题,然后按照我上面所说的来省略你的TextView
。
【讨论】:
谢谢,但不幸的是它仍然不起作用。会不会跟tableLayout有关系? NP...另外,WRT TableLayout 定义:您只需要在第一个 XML 元素上声明xmlns:android
。
这个变通办法对我不起作用。我有一个 ListView,列表中的每个项目在 TableLayout 中都有多个文本视图。当我将 inputType='text' 添加到可能会变长的文本视图中时,我无法再从列表中选择项目。另外,我仍然没有看到椭圆。我确实为该错误投票,但它已关闭且不可重现。也许可以创建一个新的错误报告。还有其他想法吗?
我同意,这对我不起作用。 TextView 变长了,偏移了它所在的水平线性布局的其他部分。这个属性是否依赖于一些特定的变量。我最终设置了 android:maxLength="x" 并修剪了文本,没有省略号
android:singleLine 从什么时候开始贬值的? developer.android.com/reference/android/widget/…【参考方案3】:
我得到了和史蒂夫一样的结果:
android:ellipsize="marquee" android:scrollHorizontally="true" android:lines="1"
完美运行
【讨论】:
【参考方案4】:试试……
即
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 上的评论#2 选择或聚焦视图时有效
【讨论】:
我个人发现android:ellipsize="marquee" android:scrollHorizontally="true" android:lines="1"
是你所需要的。【参考方案5】:
在查看了这 3 个问题(关闭和重新打开)和以前的帖子之后,我认为关键是用外部 LinearLayout(或您正在使用的任何其他布局)包装 TextView,并设置“ layout_width" 的外部布局宽度比 TextView 中包含的文本长度略SMALLER。似乎必须限制宽度才能使“android:ellipsize”正常运行。
按照this issue中的提示,在添加了所有这些hacking属性后,我还将外部LinearLayout的layout_width设置为240dp,例如:
<Linearlayout
android:layout_
android:layout_
...>
<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 中使用它都有效。
这是我的结果截图!
这 3 个问题的参考:
issue 882
issue 10554
issue 31229
【讨论】:
我在问题 882 code.google.com/p/android/issues/detail?id=882 中添加了适合我的代码。感谢您的链接。【参考方案6】:如果您将 TextView 放在您创建的自定义 ViewGroup 中,如果您在测量后更改了尺寸,请确保再次对其进行测量。
例如,我在 onLayout 中计算了新维度。在调用 child.layout 之前,调用
measureChild(child,
View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
【讨论】:
【参考方案7】:我在某处找到了这个属性
<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />
对我来说很好用(Android 1.5)
【讨论】:
singleLine 在 1.5 中已弃用 我删除了我之前的评论...在文档中找不到它,但在 Eclipse 的 XML 布局查看器中,它说 android:singleLine 已被弃用,而是使用 multiLine。【参考方案8】:对我来说,这些属性有效。我在 API 8 及更高版本上进行了测试
在 XML 中
<TextView
....
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
....
/>
以编程方式
setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
【讨论】:
OS 中的版本是 4.4.2。 Component 是一个父列表视图,目标 TextView 是 List 中项目的标题。【参考方案9】:我在回收站查看卡中遇到了同样的问题。我通过添加以下代码解决了这个问题:
<TextView
android:ellipsize="end"
android:maxLines="1"/>
【讨论】:
以上是关于Ellipsize 不适用于自定义 listView 中的 textView的主要内容,如果未能解决你的问题,请参考以下文章
UITapGestureRecognizer 不适用于 UITextField 的自定义子类
sizeWithFont:constrainedToSize 不适用于自定义字体