TextView android:ellipsize =“marquee”无法按预期工作

时间:2013-07-01 11:01:59

标签: android textview marquee

我在ListView中有一些自定义元素,每个元素最多只知道一个LinearLayout中的TextView。 我希望TextView中的文本是一个单行,当文本太长时水平滚动。我读了很多关于这个的帖子,我想出了一个应该有效的解决方案,但是我没有完整的文本滚动,而是将文本剪切到包含View的长度并以三个点结束。我不想要三个点,但需要滚动整个文本。

这是列表中项目的布局(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)中,我在返回视图之前在TextView上使用setSelected(true)方法。

我无法弄清问题是什么。任何帮助将受到高度赞赏。

7 个答案:

答案 0 :(得分:31)

我今天遇到了同样的问题,并且能够弄明白。这里没有列出的解决方案,所以我想我会分享为我修复的解决方案。

<强> TL; DR: 如果要动态设置TextView的文本,请尝试设置所需的&#34;选框&#34;代码中的属性,而不是布局xml文件中的属性。

更长的版本: 在我的例子中,我有一个带有适配器的GridView和每个项目中的TextView。有些项目的文字太长,无法容纳在其“#34; cell&#34;网格,因此我想要所有太长而无法滚动的项目。由于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);

答案 1 :(得分:12)

Key就是在文本视图上执行setSelected(true); ..当然

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

也需要在xml中设置。如果没有这一切都不会发生。如初。

答案 2 :(得分:1)

正如@iDroid Explorer指出的那样,发布和接受答案对其他人有帮助。根据我对Tom评论的回复进行调整:

  

我找到了解决问题的方法。经过一些尝试,我已经意识到了   问题是android:selectAllOnFocus =&#34; true&#34;线(阅读   @汤姆关于概率原因的解释)。我刚删除那条线,现在一切正常   非常好,文本是完整的,并在需要时滚动   包含视图的时间太长了。

答案 3 :(得分:0)

LinearLayoutTextView放在HorizontalScrollView内。这将允许文本完整显示并允许向右和向左滚动。

答案 4 :(得分:0)

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

答案 5 :(得分: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"。我刚刚删除了该行,现在一切都运行良好,文本已完成,并且当包含的视图太长时,就会按需滚动。

答案 6 :(得分: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)//将这些行添加到您的活动中