1.TextView省略号之后添加可点击文本
实现的效果图:
实现思路:
- 使用TextUtils.ellipsize来获得带省略号的文本之后再加上可点击的文本
- TextUtils.ellipsize获取带省略号文本时候传入的avail参数,要计算上要添加的文本长度来保证添加的文本不会超出TextView
- 将获得带省略号的文本加上可点击文本
- 使用ClickableSpan为可点击文本添加点击事件
-
TextView.setText()
将最终文本设置到TextView上 - xml布局文件中,TextView记得加上
android:maxLines
属性
/**
* 给TextView的超长文本省略号之后加上点击文本
*
* @param tv TextView
* @param originalText 原始的超长文本
* @param endStr 要添加在末尾的文本
* @param endStrColor 末尾文本颜色
* @param listener 点击事件
*/
public static void setEllipsize(@NonNull final TextView tv, @Nullable final String originalText, @Nullable final String endStr, @ColorInt final int endStrColor, @Nullable final View.OnClickListener listener) {
tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
TextPaint paint = tv.getPaint();
// TextView最大支持文本宽度 - 要添加在末尾的文本宽度
float avail = (tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight()) * tv.getMaxLines() - paint.getTextSize() * (endStr == null ? 0 : endStr.length() + 1);
// 获取带省略号的文本
String string = TextUtils.ellipsize(TextUtils.isEmpty(originalText) ? tv.getText() : originalText, paint, avail, TextUtils.TruncateAt.END).toString();
// 带省略号的文本 + 添加在末尾的文本
string = string + endStr;
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(string);
// 点击事件和添加在末尾的文本效果
spannableStringBuilder.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
if (listener != null) listener.onClick(view);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
// 添加在末尾的文本颜色
ds.setColor(endStrColor);
// 添加在末尾的文本去掉下划线
ds.setUnderlineText(false);
// 清除阴影
ds.clearShadowLayer();
}
}, string.length() - endStr.length(), string.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 重新设置TextView文本
tv.setText(spannableStringBuilder);
// 去除默认点击后背景变色效果
tv.setHighlightColor(Color.TRANSPARENT);
// 让点击事件可以生效
tv.setMovementMethod(LinkMovementMethod.getInstance());
// 取消关注,让点击事件与ListView的Item点击事件不再冲突
tv.setFocusable(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
网友评论