Android的TextView可以设置超链接,这些超链接都可以相应的跳转到对应的应用.!
例如,你如果设置了autoLink为Phone,那么你点击的时候就会到拨号的那个页面去! email和html超链接同理.
项目中本来有个是写在TextView里的, 同事给加了AutoLink为Phone. 但是项目中其他的地方(例如Dialog) 都是一点就直接打电话的. 那么此时我就想
能不能不用TextView自己的那一套玩意! 我首先想到继承TextView, 这个我后来看了下, 一是这里基于SDK开发并且木有源代码给我看, 而且工作量未知,所以放弃.
网上搜了一堆资料. 还是有启发. 用Spanable去对TextView进行一些设置, 让他处理我自己定义的东东!
SDK里面关于Spanable的API描述的太少了! 借着网上的资料和摸索, 把功能实现了.
1: 获得TextView
这个就findViewById获取就可以了
2: 创建SpannableString
构造方法里面要接收一个源字符串(String source), 那么大家要注意了, 这个字符串是会全部显示在TextView中的.
例如我这里的源字符串是: :400-xxx-xxxx
3:给SpannableString设置超链接
spString.setSpan(new YURLSpan("tel:400xxxxxxx"), 5, spString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
这里面第一个参数是 Span的类型, 我这里就写一个UrlSpan, 跟源码得知,其实文字的链接属性只需要给一个ClickableSpan就可以了
第二个参数的意思是 超链接的部分从源字符串中开始的索引, 第三个参数是超链接的部分从源字符串中结束的索引. 第四个参数是flag, 有兴趣的自己去研究下
4: 让超链接可点
textView.setMovementMethod(LinkMovementMethod.getInstance());
一定要设置这个, 不设置超链接无法点击
5: 设置TextView的文字
textView.setText(spString);
6:创建ClickableSpan的实现类,并重写onClick方法
private class YURLSpan extends URLSpan {
public YURLSpan(String url) {
super(url);
}
public void onClick(View widget) {
String url = getURL();
Intent intent = new Intent(
Intent.ACTION_CALL, Uri
.parse(url));
startActivity(intent);
}
}
这里我就直接继承的URLSpan. 如果大家继承ClickableSpan的话, 在构造方法中把url赋给成员变量就可以了.
补充一点, 如果需要设置超链接为无下划线的话, 需要重写ClickableSpan的updateDrawState方法
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
此方法还适用于自定义超链接启服务或者是跳转Activity..