【问题标题】:Ellipsize not working for textView inside custom listViewEllipsize 不适用于自定义 listView 中的 textView
【发布时间】:2010-11-28 07:10:15
【问题描述】:

我有一个列表视图,其中包含由下面的 xml 布局定义的自定义对象。我希望 id 为“info”的 textView 在一行上被省略,我尝试使用属性

android:singleLine="true"
android:ellipsize="end"

没有成功。

如果我将 layout_width 设置为固定宽度,例如

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> 

【问题讨论】:

    标签: xml android textview


    【解决方案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_width="fill_parent"
        android:layout_height="fill_parent"
        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_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 中使用它都有效。

      这是我的结果截图!

      这 3 个问题的参考:

      issue 882

      issue 10554

      issue 31229

      【讨论】:

      【解决方案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"/>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          相关资源
          最近更新 更多