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 似乎也只适用于 scrollHorizo​​ntally 设置。 它不适用于 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:scrollHorizo​​ntally="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 的自定义子类

CSS 样式表不适用于自定义 QWidget

sizeWithFont:constrainedToSize 不适用于自定义字体

缩进不适用于自定义 UITableViewCell

UITapGestureRecognizer 不适用于 UIImageView 自定义类

自定义样式不适用于 angular 10