废话不多说,上图看栗子
SpannableStringBuilder主要是用到SpannableStringBuilder这个类,可以对文字进行简单配置:
- 自定义文本中文字的字体大小(包括绝对大小和相对大小)
- BackgroundColorSpan : 文本背景色
- ForegroundColorSpan : 文本颜色
- StrikethroughSpan : 删除线
- UnderlineSpan : 下划线
- SubscriptSpan : 下标 ;SuperscriptSpan : 上标
- ClickableSpan : 点击事件
- 以上是一些常用的效果,并不是全部。
代码示例:
/* 设置TextView中间字体颜色与点击事见
* start 开始文字的位置 坐标从 0开始
* end 改变结束的位置 ,并不包括这个位置。
* 使用BackgroundColorSpan设置背景颜色。
*/
private void setTextInfo(TextView tv) {
String content = tv.getText().toString();
final SpannableStringBuilder style = new SpannableStringBuilder();
style.append(content );//添加需要改变的文本
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);//取消点击事见字体的背景颜色
tv.setHighlightColor(getResources().getColor(android.R.color.transparent));
}
//变色字体点击监听设置
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(context,"变色字体的点击事件",Toast.LENGTH_SHORT).show();
}
};
style.setSpan(clickableSpan, 7, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(style);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#2B509B"));
style.setSpan(foregroundColorSpan, 7, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(style);
}
下面是 TextView通过SpannableStringBuilder设置两处内容文字点击事件和两处字体颜色变色。
TextView tv_content = findViewById(R.id.tv_content);
//《隐私政策》、《使用条款》其中的内容需要设置变色和设置可点击事件
String tv_content = "请充分阅读并理解《隐私政策》与《使用条款》。";//控件文本内容
String content = tv_content .getText().toString();
tv_content.setText(updateTextStyle(content));
//添加这句话,否则点击不生效
tv_content.setMovementMethod(LinkMovementMethod.getInstance());
==========================================================================
//主要方法
private SpannableStringBuilder updateTextStyle(String content) {
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append(content);
//使用ForegroundColorSpan添加点击事件会出现冲突
UnderlineSpan colorSpan = new UnderlineSpan() {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#fe9500"));//设置颜色
}
};
//使用UnderlineSpan很好的兼容这个问题
UnderlineSpan colorSpan1 = new UnderlineSpan() {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#fe9500"));//设置颜色
// ds.setUnderlineText(false); //去掉下划线
}
};
int privacyBeginIndex = content.indexOf("《");
int privacyEndIndex = content.indexOf("》") + 1;
int protocolBeginIndex = content.lastIndexOf("《");
int protocolEndIndex = content.lastIndexOf("》") + 1;
ClickableSpan privacyClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this, "123", Toast.LENGTH_LONG).show();
}
};
ClickableSpan protocolClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this, "123", Toast.LENGTH_LONG).show();
}
};
spannableString.setSpan(protocolClickableSpan, protocolBeginIndex, protocolEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spannableString.setSpan(privacyClickableSpan, privacyBeginIndex, privacyEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//字体颜色一定要放在点击事件后面,不然部分手机不会修改颜色
spannableString.setSpan(colorSpan, protocolBeginIndex, protocolEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spannableString.setSpan(colorSpan1, privacyBeginIndex, privacyEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
return spannableString;
}
以下两个地方的字体颜色和点击事件就OK了。
网友评论