【问题标题】:TextView android:ellipsize="marquee" not working as expectedTextView android:ellipsize="marquee" 没有按预期工作
【发布时间】:2013-07-01 11:01:59
【问题描述】:

我在 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)中,我在 TextView 上使用 setSelected(true) 方法,然后返回视图。

我不知道问题出在哪里。任何帮助将不胜感激。

【问题讨论】:

  • 我也有同样的问题!我尝试了很多不同的解决方案,但都没有奏效!
  • 嗨安德烈,你能发布你的 getView() 吗?谢谢。
  • 我认为这里发生了什么很清楚。但是,有两种解决方案,如果没有代码,我无法判断您需要哪一种!所以,告诉我,如果你以编程方式设置你的ListView s.t. setItemsCanFocus(false),这能解决你的问题吗?如果没有,还有其他东西可以解决它。
  • 汤姆,感谢您的回复!实际上,我找到了解决问题的方法。经过一些尝试,我意识到问题出在android:selectAllOnFocus="true" 行。我真的不明白为什么,但这条线给出了我在问题中描述的奇怪行为。现在一切都运行良好,文本已完成,并且当包含视图太长时,它可以按预期滚动。
  • 我大概可以解释一下。这是因为在 Listview 的onLayout 中,获得了选定的子sel,并且setSelected 被设置为false,因为复杂的条件可以通过几种方式破坏 - 一种是上述方式,一种是您的方式。在gtView 中设置setSelected 不起作用,因为该步骤被处理之前 listview 对元素执行onLayout。 (需要澄清时请参阅grepcode.com/file_/repository.grepcode.com/java/ext/…!)

标签: android textview marquee


【解决方案1】:

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

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);

【讨论】:

  • 幸运的是我已经解决了,但是感谢您分享您的解决方案,它可能对其他有类似问题的人有用。我个人更喜欢将所有内容都保留在 xml 布局中,并以编程方式仅设置无法在 xml 中设置的内容(但这当然是个人喜好问题)。
  • 当然,我完全同意。我的问题是在 xml 中设置它们不起作用,并导致您在上面描述的奇怪行为。 (在滚动时显示 3 个点,而不是全文。)我更愿意在 xml 中设置属性,但出于某种原因,在代码中设置它们(在设置文本之后)解决了我的问题。我猜是因为计算椭圆和选取框动画的数学计算得太早了,并且在文本实际动态设置之前。 (在我的例子中,文本必须在代码中设置,因为这是一个重复的视图和一个适配器。)
  • 当调用像.setText() 这样无辜的东西时,您的 XML 设置发生意外的事情并不好。 :(
  • 有趣的是,最终结果是随机的,有时如果仅通过设置 isSelected(true) 就可以工作,有时将其与代码中的其余参数而不是每次文本更改时的 xml 耦合。感谢您的回答,现在我什至不会认为我会在每个预期滚动的 textview 之后盲目地插入它们
  • 漂亮的答案!如果您使用tv.setText("MESSAGE"),则基本上以编程方式设置所有属性。伟大的发现!
【解决方案2】:

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

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

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

【讨论】:

  • 我还需要添加 singleLine="true",这很奇怪,尤其是因为它已被弃用。
【解决方案3】:

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

我找到了解决问题的方法。经过一些尝试,我意识到 问题是 android:selectAllOnFocus="true" 行(阅读 @Tom 对可能原因的解释)。我刚刚删除了那条线,现在一切正常 很好,文本是完整的,并且可以按需要滚动 对于包含视图来说太长了。

【讨论】:

  • 我是否可以至少收到一个关于否决票的解释?如果提议的解决方案对任何人都不起作用,这并不意味着解决方案本身是错误的。这可能是由于不同的条件或其他原因...
  • 焦点被我的布局上的另一个视图所占据,把它交给了 textview 和瞧,它按预期工作。谢谢。
【解决方案4】:

将您的LinearLayoutTextView 放在HorizontalScrollView 中。这将允许文本完整显示并允许左右滚动。

【讨论】:

  • 好主意,但我想这和选框不一样...?
  • 感谢 Mike 的回复,请参阅我对 Tom 建议的评论。实际上,删除android:selectAllOnFocus="true" 行解决了问题!
【解决方案5】:

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

【讨论】:

  • 感谢chirsbjr 的回复,但我已经尝试过您建议的更改,但没有成功。事实上wrap_content 属性对TextView 很有效。请参阅我对原始问题中汤姆建议的评论。实际上,删除android:selectAllOnFocus="true" 行解决了问题!
  • @chrisbji 是否可以在线性布局中我在线性布局中有文本,我想在线性布局中设置选取框??
【解决方案6】:

我的 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"。我刚刚删除了该行,现在一切运行良好,文本完整,并且当它对于包含视图而言太长时可以按需要滚动。

【讨论】:

    【解决方案7】:
    <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) // 在你的 Activity 中添加这些行

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2021-10-19
      • 2020-03-18
      • 2012-06-14
      • 2014-11-15
      • 1970-01-01
      相关资源
      最近更新 更多