我们都知道WebView可以实现点击链接查看详情的功能,无论是APP内显示还是浏览器外显示,都很自如。但是WebView带来的高内存,网络请求耗时也是不可避免的。现在我们要仿照WebView的这一功能,给TextView添加链接跳转。
比如有这样一个需求,在”第一个界面是正常内容的,第一个界面中只有一个TextView,第一个界面中的TextView通过点击跳转,跳转到第二个界面。“这个内容中,设置关键字”第一个“和“第二个”分别用浏览器打开“http://3g.cnfol.com/"和"http://blog.youkuaiyun.com/lxm20819”两个网址。我们首先想到的应该是SpannableString的ClickSpan方法,关于SpannableString的一些其他方法,可以查看,可以自行查看问谷歌。我这里主要讲一下ClickSpan。ClickSpan主要有两个方法
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
super.updateDrawState(ds);
//第一个方法主要是设置要跳转的文字的颜色
ds.setColor(0xffff0000);
//此方法是否设置下划线,可根据需求自由定制
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
//onClick方法主要设置点击事件
Toast.show(...);
}
}, start, end,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
按照这个简单介绍,目前可以满足点击文字跳转的问题。但是比如我刚才的例句里面,有两个关键字“第一个”和“第二个”,并且"第一个"关键字在例句里出现了两次,这是我们苦恼了,关键字的内容和出现的位置,以及相对应的跳转链接都是不一样的。于是我们开始发现ClickableSpan方法中有start和end两个参数,查阅相关文档,可知是设置关键的位置和长度的。综上述构思,我们把上面的方法进行包装处理:
final SpannableString spannableString = new SpannableString(str);
if (list != null && list.size() != 0) {
String content = spannableString.toString();
for (int i = 0; i < list.size(); i++) {
final TopicLinkBean topicLinkBean = list.get(i);
final String data =topicLinkBean.getContent();
String temp = content;
int startNew = 0;
int startOld = 0;
while (temp.contains(data)) {
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
super.updateDrawState(ds);
ds.setColor(0xffff0000);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) { <pre name="code" class="java"> Toast.show(...);
} }, startOld + temp.indexOf(data), startOld + temp.indexOf(data) + data.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannableString); startNew = temp.indexOf(data) + data.length(); startOld += startNew; temp = temp.substring(startNew); } } } else { setText(spannableString); }
其中list为存储关键字的集合,TopicLinkBean为关键字对象。当我们按照上述方法设置时,发现点击链接功能并不好使,这时的你可能想放弃了,纠结一会之后查看文档,发现配合ClickSpan使用的还要添加一个
setMovementMethod(LinkMovementMethod.getInstance());这个方法,设置点击可用。我们添加之后,发现点击跳转成功了,顿时天晴了。
接下来就是要对代码的优化处理,我们添加一个接口,将里面的颜色设置和点击处理同步出去,这样可以自由定制不同的显示。
public void setClick(String str, final ArrayList<TopicLinkBean> list, final SetSpanListener listener) {
final SpannableString spannableString = new SpannableString(str);
if (list != null && list.size() != 0) {
String content = spannableString.toString();
for (int i = 0; i < list.size(); i++) {
final TopicLinkBean topicLinkBean = list.get(i);
final String data =topicLinkBean.getContent();
String temp = content;
int startNew = 0;
int startOld = 0;
while (temp.contains(data)) {
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
super.updateDrawState(ds);
listener.updateDrawState(ds);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
listener.onClick(widget, topicLinkBean);
}
}, startOld + temp.indexOf(data), startOld + temp.indexOf(data) + data.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
setText(spannableString);
setMovementMethod(LinkMovementMethod.getInstance());
startNew = temp.indexOf(data) + data.length();
startOld += startNew;
temp = temp.substring(startNew);
}
}
} else {
setText(spannableString);
}
ClickSpan的介绍就到这里了,有不足之处欢迎批评指导!