Android TextView中實現點擊文本超連結(無底線)的封裝類,androidtextview
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中的文字不一樣,直接忽略這個問題即可。
怎實現TextView中,部分文字響應點擊跳轉到新的頁面
在TextView添加一個屬性:android:autoLink="web" 相當於添加一個連結。不知道是否對你有協助。
android textview怎通過代碼將文本轉換為超連結
設定textview的onclicklistener,這監聽器裡呼叫瀏覽器開啟你的連結