最近接到了一个新的需求。客户要在一段文字说明中,分别在两处地方显示不同颜色,并且会触发不同的点击事件。一开始使用Lilinelayout布局,横向排列几个Textview,但是这种方法不灵活,且在分辨率较低的手机上会造成换行时,没办法从第一个Textview底下开始换行。在网上找了一下资料,发现用SpannableString可以完美实现上述需求:
我们需要实现的是上述的《用户协议》与《法律声明》显示黄色且分别响应不同的点击事件。XML中只用到了一个简单的Textview控件,故省略XML代码
String textstring1 = "已阅读并同意";
String textstring2 = "《用户协议》";
String textstring3 = "和";
String textstring4 = "《法律声明》";
SpannableString ss1 = new SpannableString(textstring2);
ss1.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
//《用户协议》点击事件
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false); //取消下划线
ds.setColor(mContext.getResources().getColor(R.color.yellow)); //设置字体颜色
}
},0,textstring2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString ss2 = new SpannableString(textstring4);
ss2.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
//《法律声明》点击事件
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false); //取消下划线
ds.setColor(mContext.getResources().getColor(R.color.yellow)); //设置字体颜色
}
},0,textstring4.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//tvagree为Textview控件
tvagree.setText(textstring1);
tvagree.append(ss1);
tvagree.append(textstring3);
tvagree.append(ss2);
tvagree.setMovementMethod(LinkMovementMethod.getInstance());