描述: 一个很常见的需求,多用于商品详情页的描述吧。
照惯例,先上效果图
实现方式也很简单,主要是用了SpannableString。对文字样式进行修改 上代码:
public void onMessage(String message) {
this.message = message;
if (message == null || message.isEmpty())
this.message = "默认字符串";
if (this.message.length() > 50) {
setMessage(2);
} else {
setMessage(1);
}
}
public void setMessage(int label) {
if (message != null && !message.isEmpty()) {
String str;//显示的字符串
str = "简介:" + message;
SpannableString spannableString = null;
if (str.length() <= 50)//字符串长度不够
label = 1;
switch (label) {
case 2:
//展开
str = str.substring(0, 50);
str += "...展开";
spannableString = new SpannableString(str);
//可点击
ClickableSpan clickableSpan1 = new ClickableSpan() {
@Override
public void onClick(View widget) {
setMessage(3);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.parseColor("#00BFFF"));
}
};
spannableString.setSpan(clickableSpan1, str.length() - 2, str.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
break;
case 3:
//收起
str += "收起";
spannableString = new SpannableString(str);
//可点击
ClickableSpan clickableSpan2 = new ClickableSpan() {
@Override
public void onClick(View widget) {
setMessage(2);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.parseColor("#00BFFF"));
}
};
spannableString.setSpan(clickableSpan2, str.length() - 2, str.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
//收起
break;
default:
//直接展示
spannableString = new SpannableString(str);
break;
}
StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
spannableString.setSpan(styleSpan, 0, 3, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
mActivityMainBinding.tvStr.setText(spannableString);
mActivityMainBinding.tvStr.setMovementMethod(LinkMovementMethod.getInstance());
}
}
代码是根据自己需求写的。也有优化的空间,这里就不赘述了