网上的方法多是要重写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"/>