概述
一般的,我们遇到文本要以不同的颜色展示的时候,都会考虑到使用SpannableString,单纯的String不能满足我们的需求
步骤
-
创建SpanableString或者SpannableStringBuilder
String agreement = getResources().getString(R.string.registration_agreement); SpannableString spannableString = new SpannableString(agreement);
-
为SpannableString设置span,调用setSpan
-
指定要设置的颜色,起始点,结束点,flag
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary)); int flag = SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE; spannableString.setSpan(foregroundColorSpan,0,7,flag);
设置颜色
当前遇到的问题是,一段文字里面有多个效果,比如
我们以上面的方式,设置span,因为调用一次,只能设置一个片段的颜色,所以调用了两次,结果是无效的,只有最后调用的那个产生了效果
解决
查找解决方式:
我们发现,主要与setSpan的时候,参数what有关,也就是第一个参数有关系
public void setSpan(Object what, int start, int end, int flags) {
setSpan(true, what, start, end, flags, true/*enforceParagraph*/);
}
博文中说到,要想多次使用,是要调用CharacterStyle类的静态方法wrap方法,所以调用变成了:
spannableString.setSpan(CharacterStyle.wrap(foregroundColorSpan),0,7,flag);
经过测试,这个方法是有效的,对于一段文字有多个片段颜色是有效的。
注意参数flag
设置点击
设置ClickableSpan可以设置部分文字的点击事件
ClickableSpan clickableSpan1 = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
ToastUtils.showShort("隐私协议");
}
// 设置去除下划线
@Override
public void updateDrawState(@NonNull TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannableStringBuilder.setSpan(clickableSpan, 11, 17, flag);
设置指定部分的点击事件。
多个片段的点击事件
前面的提到,设置一段文字中多个片段的颜色的时候,要使用CharacterStyle.wrap方法来处理才会有效果,但是设置多个片段的点击事件的时候,不需要调用这个方法,直接设置多个ClickableSpan方法就可以
最后需要设置LinkMovementMethod
tvAgreementContent.setText(spannableStringBuilder);
tvAgreementContent.setMovementMethod(LinkMovementMethod.getInstance());
至此,连颜色带点击事件,设置完成。