15

我在 ListView 中有一些自定义元素,据了解,每个元素只是 LinearLayout 中的一个 TextView。当文本太长时,我希望 TextView 中的文本是水平滚动的单行。我阅读了很多关于此的帖子,并想出了一个应该可以工作的解决方案,但是我没有让全文滚动,而是将文本剪切到包含视图的长度并以三个点结尾。我不想要三个点,但需要滚动整个文本。

这是列表中项目的布局 (list_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listItem"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/list_item_selector"
    android:orientation="horizontal"
    android:paddingBottom="7dp"
    android:paddingLeft="15dp"
    android:paddingTop="7dp" >

    <TextView
        android:id="@+id/listText"
        style="@style/Text_View_Style_White"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever" 
        android:padding="3dp"

        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:textColor="@drawable/list_item_text_selector" />


</LinearLayout>

我也尝试了android:focusable="true",android:scrollHorizontally="true"android:maxLines="1"属性,但它们都不起作用。在getView()适配器(扩展 BaseAdapter)的方法中,我setSelected(true)在返回视图之前使用 TextView 上的方法。

我无法弄清楚问题是什么。任何帮助将不胜感激。

4

7 回答 7

41

我今天遇到了同样的问题,并且能够解决。此处列出的解决方案均无效,因此我想我会分享为我解决的问题。

TL;DR: 如果您要动态设置 TextView 的文本,请尝试在代码中而不是在布局 xml 文件中设置所需的“选框”属性。

更长的版本: 就我而言,我有一个带有适配器的 GridView 和每个项目中的 TextView。一些项目的文本太长而无法放入网格的“单元格”中,因此我希望所有项目都太长而无法滚动几次。由于 TextView 位于带有适配器的 GridView 中,因此文本显然是在代码中设置的,来自适配器的当前项。

经过许多痛苦的调试,我终于有了用代码而不是布局 xml 文件来设置所有选取框设置的想法。这导致 3 个点 (...) 最终离开 TextView 并开始滚动。

这是我的布局文件现在的样子:(请注意,上面列出的属性均未在此处设置)

<TextView
android:text="Placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:id="@+id/name"
/>

这是我的适配器代码的样子:

nameView.setText(name);
nameView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
nameView.setSingleLine(true);
nameView.setMarqueeRepeatLimit(5);
nameView.setSelected(true);
于 2014-04-01T20:37:24.440 回答
13

关键是在这里做setSelected(true);文本视图..当然

android:ellipsize="marquee"
android:scrollHorizontally="true"

也需要在xml中设置。没有所有这些选框将不会发生。曾经。

于 2014-04-10T13:01:09.950 回答
1

正如@iDroid Explorer 指出的那样,发布和接受答案可能对其他人有所帮助。改编自我对汤姆评论的回复:

我找到了解决我的问题的方法。经过一些尝试,我意识到问题出在 android:selectAllOnFocus="true" 行(请阅读@Tom 的解释以了解可能的原因)。我刚刚删除了那条线,现在一切都运行良好,文本完整,并且当包含视图太长时,它可以像期望的那样滚动。

于 2015-01-07T08:44:03.057 回答
0

要么把你的LinearLayout或你的TextView放在一个HorizontalScrollView. 这将允许完整显示文本并允许左右滚动。

于 2013-07-01T13:17:28.210 回答
0

尝试将您的 layout_width 设置为“match_parent”。TextView 需要特定宽度才能使省略号起作用,并且不能与“wrap_content”一起使用。

于 2013-07-01T13:33:50.447 回答
0

我的 textView 面临同样的问题现在得到了它显示的原因......在文本的末尾。!

               <TextView
                android:id="@+id/MarqueeText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="2dp"
                android:ellipsize="marquee"
                android:singleLine="true"
                android:maxLines="1"
                android:textColor="@color/text_gray"
                android:textSize="14sp"
                android:text="START | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | END" />

在我的活动中初始化后

MarqueeText.setSelected(true);

我找到了解决我的问题的方法。经过一些尝试,我意识到问题出在android:textIsSelectable="true". 我刚刚删除了那条线,现在一切都运行良好,文本完整,并且当包含视图太长时,它可以像期望的那样滚动。

于 2017-10-18T10:28:03.533 回答
0
<TextView
    android:text="START | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | END"
android:id="@+id/MarqueeText" 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:singleLine="true"
android:ellipsize="marquee" 
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true" 
android:paddingLeft="15dip" 
android:paddingRight="15dip" 
android:focusable="true" 
android:focusableInTouchMode="true" 
android:freezesText="true">` 

textView.setSelected(true) // 在您的活动中添加这些行

于 2020-09-17T09:22:59.150 回答