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之事件分发机制的理解
- Android(安卓)简单自定义对话框:语言切换
- 获取Android所有的应用和包名 点击跳转已安装应用
- 【Android】ImageButton的记录
- 关于android中alarm的使用
- Android(安卓)Room 框架学习
- Android(安卓)搜索框:SearchView 的属性和用法详解
- android ListView+CheckBox实现单选
- Android在诸如editText等组件设置输入法半屏幕显示的说明