TextView的ClickSpan

  我们都知道WebView可以实现点击链接查看详情的功能,无论是APP内显示还是浏览器外显示,都很自如。但是WebView带来的高内存,网络请求耗时也是不可避免的。现在我们要仿照WebView的这一功能,给TextView添加链接跳转。

  比如有这样一个需求,在”第一个界面是正常内容的,第一个界面中只有一个TextView,第一个界面中的TextView通过点击跳转,跳转到第二个界面。“这个内容中,设置关键字”第一个“和“第二个”分别用浏览器打开“http://3g.cnfol.com/"和"http://blog.csdn.net/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的介绍就到这里了,有不足之处欢迎批评指导!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值