Android TextView中实现点击文本超链接(无下划线)的封装类

 android中有的时候需要在TextView上设置一些超链接,点击这些超链接时进行一些操作。例如新浪微博上的一些关键字,点击时会跳转到相应的页面。


      如何实现我们就直接看源码吧。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 
  3.  *  created by Mr.Simple, Aug 21, 20141:51:40 PM. 
  4.  *  Copyright (c) 2014, hehonghui@umeng.com All Rights Reserved. 
  5.  * 
  6.  *                ##################################################### 
  7.  *                #                                                   # 
  8.  *                #                       _oo0oo_                     #    
  9.  *                #                      o8888888o                    # 
  10.  *                #                      88" . "88                    # 
  11.  *                #                      (| -_- |)                    # 
  12.  *                #                      0\  =  /0                    #    
  13.  *                #                    ___/`---'\___                  # 
  14.  *                #                  .' \\|     |# '.                 # 
  15.  *                #                 / \\|||  :  |||# \                # 
  16.  *                #                / _||||| -:- |||||- \              # 
  17.  *                #               |   | \\\  -  #/ |   |              # 
  18.  *                #               | \_|  ''\---/''  |_/ |             # 
  19.  *                #               \  .-\__  '-'  ___/-. /             # 
  20.  *                #             ___'. .'  /--.--\  `. .'___           # 
  21.  *                #          ."" '<  `.___\_<|>_/___.' >' "".         # 
  22.  *                #         | | :  `- \`.;`\ _ /`;.`/ - ` : | |       # 
  23.  *                #         \  \ `_.   \_ __\ /__ _/   .-` /  /       # 
  24.  *                #     =====`-.____`.___ \_____/___.-`___.-'=====    # 
  25.  *                #                       `=---='                     # 
  26.  *                #     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   # 
  27.  *                #                                                   # 
  28.  *                #               佛祖保佑         永无BUG              # 
  29.  *                #                                                   # 
  30.  *                ##################################################### 
  31.  */  
  32.   
  33. package com.umeng.community.utils;  
  34.   
  35. import android.content.Context;  
  36. import android.text.Html;  
  37. import android.text.Spannable;  
  38. import android.text.SpannableStringBuilder;  
  39. import android.text.TextPaint;  
  40. import android.text.method.LinkMovementMethod;  
  41. import android.text.style.ClickableSpan;  
  42. import android.text.style.URLSpan;  
  43. import android.widget.TextView;  
  44.   
  45. /** 
  46.  * @author mrsimple 
  47.  */  
  48. public abstract class TopicSpanWrapper extends ClickableSpan {  
  49.     protected Context mContext;  
  50.     protected TextView mTextView;  
  51.   
  52.     /** 
  53.      * @param context 
  54.      * @param tv 
  55.      */  
  56.     public TopicSpanWrapper(Context context, TextView tv) {  
  57.         mContext = context;  
  58.         mTextView = tv;  
  59.         updateClickSpan(tv);  
  60.     }  
  61.   
  62.     /** 
  63.      * 更新Span 
  64.      *  
  65.      * @param rv 
  66.      */  
  67.     public void updateClickSpan(TextView tv) {  
  68.         // 这里拼接超链接, 我在前后加了一个井号,可自行去除  
  69.         String htmlLinkText = "<a href='这里可以填写某个url'>#" + tv.getText().toString() + "#</a>";  
  70.   
  71.         tv.setText(Html.fromHtml(htmlLinkText));  
  72.         tv.setMovementMethod(LinkMovementMethod.getInstance());  
  73.         CharSequence text = tv.getText();  
  74.         if (text instanceof Spannable) {  
  75.             int end = text.length();  
  76.             Spannable sp = (Spannable) tv.getText();  
  77.             URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);  
  78.             SpannableStringBuilder style = new SpannableStringBuilder(text);  
  79.             style.clearSpans(); // should clear old spans  
  80.             for (URLSpan url : urls) {  
  81.                 // 设置Span  
  82.                 style.setSpan(this, sp.getSpanStart(url), sp.getSpanEnd(url),  
  83.                         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  84.             }  
  85.             tv.setText(style);  
  86.         }  
  87.     }  
  88.   
  89.     @Override  
  90.     public void updateDrawState(TextPaint ds) {  
  91.         super.updateDrawState(ds);  
  92.         // 去掉超链接的下划线  
  93.         ds.setUnderlineText(false);  
  94.     }  
  95. }  

使用示例 : 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class UserInfoActivity extends FragmentActivity implements OnClickListener {  
  2.   
  3.     FragmentManager mFragmentMan;  
  4.     
  5.   
  6.     private TextView mUserNameTv;  
  7.   
  8.     /* 
  9.      * (non-Javadoc) 
  10.      * @see android.app.Activity#onCreate(android.os.Bundle) 
  11.      */  
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.umeng_comm_user_info);  
  17.   
  18.         initUIComponents();  
  19.     }  
  20.   
  21.     /** 
  22.      *  
  23.      */  
  24.     private void initUIComponents() {  
  25.         mFragmentMan = getSupportFragmentManager();  
  26.         mPostedFragment = new PostedFragment();  
  27.         mFragmentMan  
  28.                 .beginTransaction()  
  29.                 .add(R.id.user_info_fragment_container, mPostedFragment,  
  30.                         PostedFragment.class.getSimpleName()).commit();  
  31.   
  32.         // 布局就不给出了,总之user_name_tv是一个TextView  
  33.         mUserNameTv = (TextView) findViewById(R.id.user_name_tv);  
  34.   
  35.         /** 
  36.          * 将TextView中的文本包装成可点击的超链接 
  37.          */  
  38.         new TopicSpanWrapper(this, mUserNameTv) {  
  39.   
  40.             @Override  
  41.             public void onClick(View widget) {  
  42.                 Toast.makeText(mContext, "点击了超链接文本", Toast.LENGTH_SHORT).show();  
  43.             }  
  44.         };  
  45.   
  46.        
  47.     }  
  48.   
  49. }  

效果如图 : 

  


点击以后 




图片中Toast的文字和代码的不一致,是因为文中写的与我demo中的文字不一样,直接忽略这个问题即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值