实现上面图像的效果,点击超链接跳转到对应链接,点击用户名或主题跳转到其他Activity并把用户名作为参数传递过去。同时实现区分邮箱跟用户的混淆
(如上面lau@qq.com不会被认为有一个用户@qq.com)
SpannableStringDemoActivity.java
package com.lau.spannablestring;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.CharacterStyle;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.TextView;
public class SpannableStringDemoActivity extends Activity {
TextView textView = null;
final static String string = "#刘翔# //@李开复: @薛蛮子:@李开复: @李开复:@李开复:@李开复:lau@qq.com " +
"http://www.baidu.com/index.php?tn=360se_dg " +
"转发// //@新周刊:@李承鹏:@财经网: Email:lau@qq.com又是公安牵头。@李承鹏@李承鹏@李承鹏@李承鹏:随时随刻离不开暴力。";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView1);
ssb.append(string);
findAt(string, 0);
findTheme(string, 0);
findLink(string, 0);
findEmail(string, 0);
textView.setText(ssb);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
private static final String STR_PATTERN_AT = "@[\\u4e00-\\u9fa5\\w\\-]+";
private static final String STR_PATTERN_THEME = "#[^\\#|.]+#";
private static final String STR_PATTERN_LINK = "http://[&=?/\\.\\w]+";
private static final String STR_PATTERN_EMAIL = "\\w+(\\.\\w+)*@\\w+(\\.\\w+)+";
private static final Pattern mPatternAt = Pattern.compile(STR_PATTERN_AT);
private static final Pattern mPatternTheme = Pattern.compile(STR_PATTERN_THEME);
private static final Pattern mPatternLink = Pattern.compile(STR_PATTERN_LINK);
private static final Pattern mPatternEmail = Pattern.compile(STR_PATTERN_EMAIL);
private SpannableStringBuilder ssb = new SpannableStringBuilder();
private Matcher matcher = null;
//从位置pos开始查找@关键字
void findAt(String str, int pos) {
if(str == null || str.length() == 0) {
return;
}
matcher = mPatternAt.matcher(str);
if(matcher.find()) {
final String find = matcher.group();
final int start = str.indexOf(find) + pos;
final int end = start + find.length();
MyClickableSpan clickableSpan = new MyClickableSpan(string.substring(start, end));
ssb.setSpan(clickableSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
pos = end;
findAt(string.substring(end), pos);
}
}
//从位置pos开始查找##关键字
void findTheme(String str, int pos) {
if(str == null || str.length() == 0) {
return;
}
matcher = mPatternTheme.matcher(str);
if(matcher.find()) {
final String find = matcher.group();
final int start = str.indexOf(find) + pos;
final int end = start + find.length();
MyClickableSpan clickableSpan = new MyClickableSpan(string.substring(start, end));
ssb.setSpan(clickableSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
pos = end;
findTheme(string.substring(end), pos);
}
}
//从位置pos开始查找链接关键字
void findLink(String str, int pos) {
if(str == null || str.length() == 0) {
return;
}
matcher = mPatternLink.matcher(str);
if(matcher.find()) {
final String find = matcher.group();
final int start = str.indexOf(find) + pos;
final int end = start + find.length();
URLSpanNotUnderLine urlSpan = new URLSpanNotUnderLine(string.substring(start, end));
ssb.setSpan(urlSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
pos = end;
findLink(string.substring(end), pos);
}
}
//从位置pos开始查找邮箱
void findEmail(String str, int pos) {
if(str == null || str.length() == 0) {
return;
}
matcher = mPatternEmail.matcher(str);
if(matcher.find()) {
final String find = matcher.group();
final int start = str.indexOf(find) + pos;
final int end = start + find.length();
CharacterStyle[] span = ssb.getSpans(start, end, CharacterStyle.class);
if(span != null) {
for(int i=0; i<span.length; i++) {
ssb.removeSpan(span[i]);
}
}
pos = end;
findEmail(string.substring(end), pos);
}
}
class URLSpanNotUnderLine extends URLSpan {
public URLSpanNotUnderLine(String url) {
super(url);
}
@Override
public void onClick(View widget) {
super.onClick(widget);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false); //
}
}
class MyClickableSpan extends ClickableSpan {
String str = null;
public MyClickableSpan(String str) {
this.str = str;
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), OtherActivity.class);
intent.putExtra("name", str);
startActivity(intent);
}
}
}
参考链接
http://www.dewen.org/q/1744
http://truelife.sinaapp.com/?p=303