类似于上图中 经常在微博中用到的 #文本超链接# 两个#号中间会有超链接的效果
文本超链接
1 、定义局部点击的块对象
// 超链接的块对象
ClickableSpan clickSapn = new ClickableSpan() {
// 局部被点击时触发
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this," 点击了 ",Toast.LENGTH_SHORT).show();
}
// 更新局部效果
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
ds.setFakeBoldText(true);
}
};
2 、针对显示文本创建 Spannable 对象
// 创建 Spannable 对象
SpannableString span = new SpannableString(str);
3 、设置效果
// 设置局部效果
//( 局部的效果对象,局部的起始位置,结束位置,包括方式 ) INCLUSIVE 表示包括 EXCLUSIVE 不包括
span.setSpan(clickSapn,9,13, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
注意多个效果的效果处理对象不能是同一个对象
4 、显示
// 将文本特效设置到文本框中
tv.setText(span, TextView.BufferType.SPANNABLE);
// 超链接时需要添加触摸监听的解析对象
tv.setMovementMethod(LinkMovementMethod.getInstance());
可以用以下代码测试一下:
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
String str = "你好,有什么问题请百度一下,老子是不管的"; //9-13 前包括后不包括
//超链接的块对象
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this,"点击了",Toast.LENGTH_SHORT).show();
}
//更新局部效果,使用画笔来设置
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.GREEN);
ds.setUnderlineText(false);
ds.setFakeBoldText(true);
ds.setTextSize(35);
}
};
//创建Spannable对象
SpannableString span = new SpannableString(str);
//设置局部效果
//(局部的效果对象,局部的起始位置,结束位置,包括方式) INCLUSIVE表示包裹, EXCLUSIVE不包括
span.setSpan(clickableSpan,9,13, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//此处为前包括后不包括
span.setSpan(new ForegroundColorSpan(0xFFFF0000),0,2,Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//将文本特效设置到文本框中
tv.setText(span,TextView.BufferType.SPANNABLE);
//设置触摸监听的解析对象
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}