android TextView 设置Marquee无效问题,最简便的设置

博客探讨了在Android中遇到TextView Marquee设置无效的问题。通常解决方案涉及重写isFocus方法和设置focusable属性,但这种方法有时会失效且复杂。作者提出更简单的方法,只需在XML中将SingleLine设为true,ellipize设为marquee,并在代码中调用setSelected(true)即可实现滚动效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上的方法多是要重写isFocus方法,要设置focusable,focusableInTouchmode等有时还会莫名无效,麻烦。

在TextView中有这个方法

@Override
public void setSelected(boolean selected) {
    boolean wasSelected = isSelected();

    super.setSelected(selected);

    if (selected != wasSelected && mEllipsize == TextUtils.TruncateAt.MARQUEE) {
        if (selected) {
            startMarquee();
        } else {
            stopMarquee();
        }
    }
}
直接调用这个方法,当前TextView是isSelected是false,且参数的值为true时就会调用startMarquu();

我们来看startMarqee()

private void startMarquee() {
    // Do not ellipsize EditText
    if (getKeyListener() != null) return;

    if (compressText(getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight())) {
        return;
    }

    if ((mMarquee == null || mMarquee.isStopped()) && (isFocused() || isSelected()) &&
            getLineCount() == 1 && canMarquee()) {

        if (mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {
            mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_FADE;
            final Layout tmp = mLayout;
            mLayout = mSavedMarqueeModeLayout;
            mSavedMarqueeModeLayout = tmp;
            setHorizontalFadingEdgeEnabled(true);
            requestLayout();
            invalidate();
        }

        if (mMarquee == null) mMarquee = new Marquee(this);
        mMarquee.start(mMarqueeRepeatLimit);
    }
}
根据这些If,要动起来,要满足那些条件,行数为1,且能滚动,能滚动的条件是文字够长,其它条件都可以满足。

所以只需要设置Xml中SingleLine为true,ellipize为marqee就行,代码中直接调用setSelected(true);搞定

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:ellipsize="marquee"/>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值