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

Android AppCompatTextView横向滚动失效问题求助

解决TextView横向滚动(跑马灯)不生效的问题

我看了你贴的代码,问题大概率出在触发滚动的判断逻辑和RecyclerView场景下的状态维护上,咱们一步步来调整:

1. 修正Adapter里的判断逻辑

你现在的判断条件 tv.getText().toString().length() > tv.getMaxLines() 完全不对——getMaxLines() 返回的是行数(这里你设了singleLine,所以是1),文本长度肯定远大于1,这逻辑根本没意义。正确的做法是判断文本的实际宽度是否超过TextView的可用宽度,这样才会触发滚动:

// 先让TextView完成自身尺寸测量
tv.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
// 用Paint精准测量文本的实际宽度
float textWidth = tv.getPaint().measureText(tv.getText().toString());
// 获取TextView的显示宽度
int viewWidth = tv.getMeasuredWidth();
// 文本宽度超过控件宽度时,开启跑马灯
if (textWidth > viewWidth) {
    tv.setSelected(true);
} else {
    tv.setSelected(false); // 文本没超出就关闭滚动
}

2. 优化布局属性(确保基础配置正确)

你的布局属性大部分没问题,但可以调整几个细节避免焦点冲突:

  • 去掉android:focusable="true"和android:focusableInTouchMode="true"——在RecyclerView里,Item的焦点会和TextView争抢,反而影响跑马灯;跑马灯生效只需要setSelected(true),不需要依赖焦点。
  • 保留核心属性:android:singleLine="true"(或android:maxLines="1")、android:ellipsize="marquee"、android:marqueeRepeatLimit="marquee_forever"、android:scrollHorizontally="true"。

修改后的布局代码:

<android.support.v7.widget.AppCompatTextView
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:text="Some text that is long enough to trigger marquee effect"
    android:textSize="24sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="@+id/guideline"
    app:layout_constraintTop_toTopOf="parent" />

3. 处理RecyclerView复用的坑

如果你的TextView是在RecyclerView的Item里,还要注意Item复用导致的selected状态丢失:

  • 在Adapter的onBindViewHolder方法里,每次绑定都要重新执行判断并设置selected状态,不能只设置一次。
  • 可以在ViewHolder里缓存测量结果,或者给TextView打Tag,避免重复测量影响性能。

最后验证

确保你的文本长度足够长(超过TextView的显示宽度),然后运行测试——只要setSelected(true)被正确触发,跑马灯应该就能正常滚动了。

内容的提问来源于stack exchange,提问作者Yunus Rajabiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:45