Android设置TextView部分文字变色及点击事件

首先要想实现文字变色以及点击,都需要使用到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);
    }
}

完!!!

你可能感兴趣的:(android)