您的位置:首页 > 移动开发 > Android开发

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

2014-06-07 18:28 686 查看
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;

@Override
protected 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 spans
for (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;
}

@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#ff00ff"));// 指定颜色值
ds.setUnderlineText(false); // 去掉下划线
ds.setFakeBoldText(true);
}

@Override
public 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;
}

@Override
public void onClick(View widget) {
Toast.makeText(mActivity, url, 0).show();
Log.e(TAG, url);
}

@Override
public 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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息