方式 一 :使用textview 自带属性
android:autoLink="web"
此方式设置的效果 如下图

注意:点击链接会直接打开手机中的浏览器打开链接且颜色更改不了
方式 二 :使用SpannableString
URL的匹配可以有2种:Linkify.addLinks(sp, Linkify.WEB_URLS)和正则表达式;
经验证:正则效果要好些
第一种经验证匹配的不是很准确,代码如下
private void setContentHttp(String str){
SpannableString sp = new SpannableString(str);
Linkify.addLinks(sp, Linkify.WEB_URLS);
URLSpan[] spans = sp.getSpans(0, str.length(), URLSpan.class);
if(spans != null && spans.length > 0){
for(int i = 0; i < spans.length ; i++){
final String url = spans[i].getURL();
sp.setSpan(new ForegroundColorSpan(Color.BLUE), sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sp.setSpan(new UnderlineSpan(), sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sp.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
ActivityAct.launchH5Activity(mContext, url, false, false, true);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
}
},sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sp.setSpan(new ViewUtils.Clickable(new OnClickListener() {
@Override
public void onClick(View v) {
ActivityAct.launchH5Activity(mContext, url, false, false, true);
}
}),sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
mActContent1.setText(sp);
mActContent1.setMovementMethod(LinkMovementMethod.getInstance());
}
第二种正则表达式:
private void setContentHttpPattern(String string){
SpannableString sp = new SpannableString(string);
String urlPattern =
"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)";
Pattern pattern = Pattern.compile(urlPattern, Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(string);
int startPoint = 0;
while (m.find(startPoint)) {
int endPoint = m.end();
String hit = m.group();
ClickableSpan clickSpan = new UrLClickSpan(hit);
sp.setSpan(clickSpan, endPoint - hit.length(), endPoint, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//用Span替换对应长度的url
startPoint = endPoint;
}
mActContent1.setText(sp);
mActContent1.setMovementMethod(LinkMovementMethod.getInstance());
}
注意:
采用SpannableString方式时不要在xml配置android:autoLink属性
若是使链接具体可点击功能的话必须设置setMovementMethod方法
参考链接:
https://www.cnblogs.com/txlbupt/p/3465847.html
https://blog.csdn.net/gdutxiaoxu/article/details/77800756
网友评论