Android中android:ellipsize="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

