android中有的时候需要在TextView上设置一些超链接,点击这些超链接时进行一些操作。例如新浪微博上的一些关键字,点击时会跳转到相应的页面。
如何实现我们就直接看源码吧。
- /**
- *
- * created by Mr.Simple, Aug 21, 20141:51:40 PM.
- * Copyright (c) 2014, hehonghui@umeng.com All Rights Reserved.
- *
- * #####################################################
- * # #
- * # _oo0oo_ #
- * # o8888888o #
- * # 88" . "88 #
- * # (| -_- |) #
- * # 0\ = /0 #
- * # ___/`---'\___ #
- * # .' \\| |# '. #
- * # / \\||| : |||# \ #
- * # / _||||| -:- |||||- \ #
- * # | | \\\ - #/ | | #
- * # | \_| ''\---/'' |_/ | #
- * # \ .-\__ '-' ___/-. / #
- * # ___'. .' /--.--\ `. .'___ #
- * # ."" '< `.___\_<|>_/___.' >' "". #
- * # | | : `- \`.;`\ _ /`;.`/ - ` : | | #
- * # \ \ `_. \_ __\ /__ _/ .-` / / #
- * # =====`-.____`.___ \_____/___.-`___.-'===== #
- * # `=---=' #
- * # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
- * # #
- * # 佛祖保佑 永无BUG #
- * # #
- * #####################################################
- */
- package com.umeng.community.utils;
- import android.content.Context;
- import android.text.Html;
- import android.text.Spannable;
- import android.text.SpannableStringBuilder;
- import android.text.TextPaint;
- import android.text.method.LinkMovementMethod;
- import android.text.style.ClickableSpan;
- import android.text.style.URLSpan;
- import android.widget.TextView;
- /**
- * @author mrsimple
- */
- public abstract class TopicSpanWrapper extends ClickableSpan {
- protected Context mContext;
- protected TextView mTextView;
- /**
- * @param context
- * @param tv
- */
- public TopicSpanWrapper(Context context, TextView tv) {
- mContext = context;
- mTextView = tv;
- updateClickSpan(tv);
- }
- /**
- * 更新Span
- *
- * @param rv
- */
- public void updateClickSpan(TextView tv) {
- // 这里拼接超链接, 我在前后加了一个井号,可自行去除
- String htmlLinkText = "<a href='这里可以填写某个url'>#" + tv.getText().toString() + "#</a>";
- tv.setText(Html.fromHtml(htmlLinkText));
- tv.setMovementMethod(LinkMovementMethod.getInstance());
- CharSequence text = tv.getText();
- if (text instanceof Spannable) {
- int end = text.length();
- Spannable sp = (Spannable) tv.getText();
- URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
- SpannableStringBuilder style = new SpannableStringBuilder(text);
- style.clearSpans(); // should clear old spans
- for (URLSpan url : urls) {
- // 设置Span
- style.setSpan(this, sp.getSpanStart(url), sp.getSpanEnd(url),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- tv.setText(style);
- }
- }
- @Override
- public void updateDrawState(TextPaint ds) {
- super.updateDrawState(ds);
- // 去掉超链接的下划线
- ds.setUnderlineText(false);
- }
- }
使用示例 :
- public class UserInfoActivity extends FragmentActivity implements OnClickListener {
- FragmentManager mFragmentMan;
- private TextView mUserNameTv;
- /*
- * (non-Javadoc)
- * @see android.app.Activity#onCreate(android.os.Bundle)
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- super.onCreate(savedInstanceState);
- setContentView(R.layout.umeng_comm_user_info);
- initUIComponents();
- }
- /**
- *
- */
- private void initUIComponents() {
- mFragmentMan = getSupportFragmentManager();
- mPostedFragment = new PostedFragment();
- mFragmentMan
- .beginTransaction()
- .add(R.id.user_info_fragment_container, mPostedFragment,
- PostedFragment.class.getSimpleName()).commit();
- // 布局就不给出了,总之user_name_tv是一个TextView
- mUserNameTv = (TextView) findViewById(R.id.user_name_tv);
- /**
- * 将TextView中的文本包装成可点击的超链接
- */
- new TopicSpanWrapper(this, mUserNameTv) {
- @Override
- public void onClick(View widget) {
- Toast.makeText(mContext, "点击了超链接文本", Toast.LENGTH_SHORT).show();
- }
- };
- }
- }
效果如图 :
点击以后
图片中Toast的文字和代码的不一致,是因为文中写的与我demo中的文字不一样,直接忽略这个问题即可。