You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中android:ellipsize="marquee"不生效问题求助

解决Android TextView Marquee跑马灯不生效的问题

我帮你排查下这个跑马灯没生效的问题,Android的TextView跑马灯(marquee)要正常工作,得满足几个关键条件,你的代码已经有了基础配置,但还缺几个核心项,咱们一步步来修正:

核心配置补充

你的现有代码里已经设置了android:ellipsize="marquee"和android:singleLine="true",但还需要添加以下属性才能触发滚动:

  • 确保TextView能获取焦点:
    Marquee默认只有在TextView拥有焦点时才会启动滚动。你需要添加这两个属性:

    android:focusable="true"
    android:focusableInTouchMode="true"
    

    这是因为默认情况下,TextView不一定能自动获取到焦点(比如布局里有其他可交互控件时),这两个属性能强制它具备获取焦点的能力,从而触发跑马灯效果。

  • 明确横向滚动行为:
    虽然singleLine已经隐含了横向滚动,但建议显式添加android:scrollHorizontally="true"来避免歧义。另外,在API 24及以上,官方更推荐用android:maxLines="1"替代android:singleLine="true",两者都能生效,但maxLines的兼容性更好。

  • 移除废弃属性:
    你代码里的android:fadingEdge="horizontal"在API 16之后就被废弃了,而且可能和marquee的滚动效果冲突,建议直接删掉这个属性。

修改后的完整代码

把这些调整整合后,你的TextView代码应该是这样的:

<TextView
    android:id="@+id/text_from"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:maxLines="1"
    android:scrollHorizontally="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:textColor="#343d43"
    android:textSize="18sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toStartOf="@id/text_to"
    app:layout_constraintStart_toStartOf="@id/label_from"
    app:layout_constraintTop_toBottomOf="@id/label_from" />

特殊场景处理(无焦点时也滚动)

如果你的TextView是在列表(RecyclerView、ListView)中,或者需要在没有焦点的情况下也持续滚动,上面的方法可能不生效。这时候可以自定义一个TextView,强制它始终处于"拥有焦点"的状态:

public class MarqueeTextView extends TextView {
    public MarqueeTextView(Context context) {
        super(context);
        initMarquee();
    }

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

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

    private void initMarquee() {
        setSingleLine(true);
        setEllipsize(TextUtils.TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1); // 设置为-1表示无限滚动,默认是3次
        setFocusable(true);
        setFocusableInTouchMode(true);
    }

    @Override
    public boolean isFocused() {
        // 强制返回true,让跑马灯无需焦点也能滚动
        return true;
    }
}

之后在布局里直接使用这个自定义控件即可:

<com.yourpackage.MarqueeTextView
    android:id="@+id/text_from"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:textColor="#343d43"
    android:textSize="18sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toStartOf="@id/text_to"
    app:layout_constraintStart_toStartOf="@id/label_from"
    app:layout_constraintTop_toBottomOf="@id/label_from" />

内容的提问来源于stack exchange,提问作者Gautam Surani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:29