android 给选中的文字添加点击事件和修改audoLink 的超链接样式

来源:互联网 发布:淘宝客营销软件 编辑:程序博客网 时间:2024/05/16 05:32

java :

package com.a;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.util.regex.PatternSyntaxException;import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.graphics.Color;import android.text.Spannable;import android.text.SpannableStringBuilder;import android.text.Spanned;import android.text.TextPaint;import android.text.style.ClickableSpan;import android.text.style.URLSpan;import android.text.util.Linkify;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class AlinkActivity extends Activity {private TextView tv;private static final String TAG = "AlinkActivity";private Activity mActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_alink);mActivity = this;tv = (TextView) findViewById(R.id.t1);String text = "Google wewew \n电话:1234812121 \n邮件:sd1233333@qq.com  \n网址:www.baidu.com ";//给选中的文字添加链接和点击事件setTextLinkedStringBuilder("Google", tv, text,"http://www.google.com");//修改audoLink 的超链接样式setURLHightLight(tv);}private void setURLHightLight(TextView tv) {Linkify.addLinks(tv, Linkify.ALL); //不要在xml中添加 android:autoLink="all"Spannable sp = (Spannable) tv.getText();int end = sp.length();URLSpan[] urlSpans = sp.getSpans(0, end, URLSpan.class);SpannableStringBuilder ssb = new SpannableStringBuilder(sp);// ssb.clearSpans(); // here  no need  clear all old spansfor (URLSpan urlSpan : urlSpans) {Uri uri = Uri.parse(urlSpan.getURL());Log.e(TAG, "urlSpan  " + uri.getScheme() + "  " + uri);ssb.removeSpan(urlSpan);ssb.setSpan(new HightlightURLSpan(urlSpan.getURL()), sp.getSpanStart(urlSpan),sp.getSpanEnd(urlSpan), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}tv.setText(ssb);}/** *  * @author alvin * 替换 audolink 的样式 * */class HightlightURLSpan extends URLSpan {private String url;public HightlightURLSpan(String url) {super(url);this.url = url;}@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(Color.parseColor("#ff00ff"));// 指定颜色值ds.setUnderlineText(false); // 去掉下划线ds.setFakeBoldText(true);}@Overridepublic void onClick(View widget) {Toast.makeText(mActivity, url, 0).show();Log.e(TAG, url);}}protected SpannableStringBuilder setTextLinkedStringBuilder(String key,TextView tv, CharSequence text,String mURL) {SpannableStringBuilder ssb = new SpannableStringBuilder(text);Pattern pKey = null;try {pKey = Pattern.compile(key, Pattern.CASE_INSENSITIVE);} catch (PatternSyntaxException e) {e.printStackTrace();return ssb;}Matcher m = pKey.matcher(ssb);while (m.find()) {Log.e("TAG", "m:" + m.start() + "--" + m.end());ssb.setSpan(new LinkTextSpan(mURL), m.start(), m.end(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}tv.setText(ssb);/** * tv.setMovementMethod(LinkMovementMethod.getInstance()); * 再设置玩text之后调用 */Linkify.addLinks(tv, Linkify.ALL); return ssb;}/** * @author alvin * 显示的文字不是链接,所以不继承 URLSpan,要不然设置无效 */class LinkTextSpan extends ClickableSpan {private static final String COLOR_HIGHT = "#659800";private String url;public LinkTextSpan(String url) {super();this.url = url;}@Overridepublic void onClick(View widget) {Toast.makeText(mActivity, url, 0).show();Log.e(TAG, url);}@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(Color.parseColor(COLOR_HIGHT));ds.setUnderlineText(true);ds.setFakeBoldText(true);}}}


下面时xml

    <TextView        android:id="@+id/t1"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:textSize="25dp" />


0 0
原创粉丝点击