首先要想实现文字变色以及点击,都需要使用到SpannableStringBuilder,实例化该类也很简单,只需将你想要处理的字符串当做参数
SpannableStringBuilder spannable = new SpannableStringBuilder(content);
那么下边便是开始实现文字变色了,调用SpannableStringBuilder的setSpan方法,该方法有四个参数:
Object what: 设置的span类型,颜色,粗体,下划线等等
int start: 开始作用的索引,包括start,索引从0开始
int end: span结束作用的索引,不包括end
int flags: 有四个取值,分别表示是否作用于span范围前后新增的字符
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE,前后都不作用
Spannable.SPAN_EXCLUSIVE_INCLUSIVE,后面作用
Spannable.SPAN_INCLUSIVE_EXCLUSIVE,前面作用
Spannable.SPAN_INCLUSIVE_INCLUSIVE,前后都作用
可以这样区分,SPAN之后第一个字母是前,第二个字母是后,EXCLUSIVE不包括,INCLUSIVE包括.
spannable.setSpan(newForegroundColorSpan(Color.RED),startIndex,endIndex,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);
接下来是指定文字的点击事件设置,步骤与设置文字变色基本相同,只需要ClickableSpan这个类来处理点击事件,我们先写一个类,继承ClickableSpan
private class TextClick extends ClickableSpan{ @Override public void onClick(View widget) { //在此处理点击事件 } }
接下来又是setSpan这个方法,但第一个参数换成我们继承ClickableSpan类的实例化,其它三个参数同上,需要注意的是setMovementMethod这个方法一定要记得设置,不然点击是不会生效的
//这个一定要记得设置,不然点击不生效
textView.setMovementMethod(LinkMovementMethod.getInstance());
spannable.setSpan(new TextClick(),startIndex,endIndex , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
那么接下来出现了一个问题,我既要让文字可点击,但是又要指定它的颜色该怎么办呢。我们查看ClickableSpan的源码会发现,它除了onClick之外,还有updateDrawState
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(true);
}
它的实现很简单,一目了然,就是设置文字颜色以及是否有下划线。那么这个问题就迎刃而解了,在我们的TextClick重写updateDrawState,即是
private class TextClick extends ClickableSpan{
@Override
public void onClick(View widget) {
//在此处理点击事件
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.RED);
}
}
SpannableStringBuilder builder = new SpannableStringBuilder(textView.getText().toString());
//ForegroundColorSpan 为文字前景色,BackgroundColorSpan为文字背景色
ForegroundColorSpan redSpan = new ForegroundColorSpan(Color.RED);
ForegroundColorSpan whiteSpan = new ForegroundColorSpan(Color.WHITE);
ForegroundColorSpan blueSpan = new ForegroundColorSpan(Color.BLUE);
ForegroundColorSpan greenSpan = new ForegroundColorSpan(Color.GREEN);
ForegroundColorSpan yellowSpan = new ForegroundColorSpan(Color.YELLOW);
builder.setSpan(redSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(whiteSpan, 1, 2, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
builder.setSpan(blueSpan, 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(greenSpan, 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(yellowSpan, 4,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
设置文字部分颜色的第二种方法:
String str = "这是"+""+"改变的颜色"+"";
tv.settxt(Html.fromHtml(str));
案例:
// 设置agree textview
String str = getResources().getString(R.string.t_register_tip7);
SpannableStringBuilder spannable = new SpannableStringBuilder(str);
//spannable.setSpan(new ForegroundColorSpan(Color.RED),34,38, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new TextClick(), 34, 38, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
m_tvTip3.setMovementMethod(LinkMovementMethod.getInstance());
m_tvTip3.setText(spannable);
private class TextClick extends ClickableSpan{
@Override
public void onClick(View widget) {
//在此处理点击事件
Intent intent = new Intent(m_context, PrivacyPolicyActivity.class);
// 开启新的Activity,关闭当前Activity
startActivity(intent);
// 切换动画,向左方向推进
overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.RED);
}
}
完!!!