TextView Marquee不起作用

时间:2012-05-05 04:27:02

标签: android textview marquee

我已经尝试了所有这些,我可以想到让这个字幕效果起作用。这是我的xml:

<TextView android:id="@+id/curPlaying"
    android:layout_width="320dp"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:ellipsize="marquee"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:marqueeRepeatLimit ="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true" 
    android:textColor="#83A602"
    android:textSize="20dp"
    android:text="Nothing Loaded" />

我在代码中将其设置为已选中。我认为它可能不起作用的唯一原因是代码会以相对频繁的间隔修改文本。

帮助?

4 个答案:

答案 0 :(得分:0)

您可以结帐Marquee feature of TextView in Android 1.1R1,这可以解释选框在获得工作时遇到问题的方法。 ScrollTextView - scrolling TextView for Android可能是个不错的选择。

答案 1 :(得分:0)

您好请尝试下面的代码,它对我来说很好......

<TextView
            android:id="@+id/mywidget"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal"
            android:lines="1"
            android:marqueeRepeatLimit="marquee_forever"
            android:scrollHorizontally="true"
            android:text="Simple application that shows how to use marquee, with a long text"
            android:textColor="#ff4500" />

TextView tv = (TextView) this.findViewById(R.id.mywidget);
        tv.setSelected(true); // Set focus to the textview

它正在使用我的三星Galaxy ACE手机。

答案 2 :(得分:0)

我发帖是因为没有可接受的答案....并且有助于未来的访问者来Stack Overflow寻求答案。

  public class AlwaysMarqueeTextView extends TextView {

  public AlwaysMarqueeTextView(Context context) {
  super(context);
  }

  public AlwaysMarqueeTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  }

  public AlwaysMarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  }

  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public AlwaysMarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);
  }

  @Override
  public boolean isFocused() {
  return true;
  }
  }

<强> activity.xml

<ivar.kov.util.textViewUtil.AlwaysMarqueeTextView
  android:id="@+id/artist_tv2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:ellipsize="marquee"
  android:focusable="true"
  android:focusableInTouchMode="true"
  android:marqueeRepeatLimit="marquee_forever"
  android:scrollHorizontally="true"
  android:singleLine="true"
  android:text="@string/appbar_scrolling_view_behavior"/>

答案 3 :(得分:0)

如果 TextView 填满整个宽度,则需要添加这些代码行

<TextView
    .
    .
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    />

也不要忘记为TexrtView设置selected

textview.setSelected(true);

如果 TextView 没有填充宽度,唯一的方法就是调用这个方法并将 TextView 传递给它。

    fun addMarquee(textView: TextView) {
    textView.viewTreeObserver.addOnGlobalLayoutListener(object :
        ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            val pixels = textView.measuredWidth - 1
            val params = textView.layoutParams
            params.width = pixels
            textView.layoutParams = params
            textView.isSelected = true
            textView.ellipsize = TextUtils.TruncateAt.MARQUEE
            textView.isSingleLine = true
            textView.marqueeRepeatLimit = -1
            textView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    })
}

注意:此方法仅在 textView 宽度为 wrap_content 时有效。