有时候会遇到这样的需求:
一个TextView显示不同的样式,并且分别可点击,那么就需要用到ClickableSpan这个类
用法步骤:
1.定义一个类继承ClickableSpan
public class UserClickSpan extends ClickableSpan{
private Integer userId;
private Activity ctx;
private String color="#8e9197";
public UserClickSpan(Activity ctx, Integer userId) {
this.userId=userId;
this.ctx=ctx;
}
public UserClickSpan(Activity ctx, Integer userId, String color) {
this.userId=userId;
this.ctx=ctx;
this.color=color;
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(Color.parseColor(color));
}
@Override
public void onClick(View widget) {
Intent it = new Intent(ctx, NewUserDetailActivity.class);
it.putExtra("user_id", userId);
ctx.startActivity(it);
}
}
2.算出截取的位置然后进行设置
SpannableString ss;
int start = 0;
int end = 0;
String userName = TextLimitUtil.subStringByLength(comment.getUserName(), 8);
if (comment.getReplyId() != null) {
String replyName = TextLimitUtil.subStringByLength(comment.getReplyName(), 8);
String textContent = userName + MyApplication.getToString(R.string.answer2) + replyName + ":" + comment.getContent();
ss = new SpannableString(textContent);
start = userName.length() + 2;
end = start + replyName.length();
ss.setSpan(new UserClickSpan((Activity) context, comment.getUserId()), 0, userName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new UserClickSpan((Activity) context, comment.getReplyId()), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
start = end + 1;
end = start + comment.getContent().length();
} else {
ss = new SpannableString(userName + ":" + comment.getContent());
ss.setSpan(new UserClickSpan((Activity) context, comment.getUserId()), 0, userName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
start = userName.length() + 1;
end = start + comment.getContent().length();
}
ss.setSpan(new ContentClickSpan(comment), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.content.setText(ss);
holder.content.setMovementMethod(LinkMovementMethod.getInstance()); //这句话必须写,否则将不可点击
备注:TextLimitUtil是一个限制文字长短的工具类,每个中文按两个字符来算,其他文字按一个字符来算,这个将会在下篇博客中展示