在做消息推送的时候,接口会返回一条带有超链的字符串,要求能够解析出里面的链接地址..以及手机号…并且蓝色字体,,下划线,,在点击链接地址时需要做自己的一些操作
废话不多说,,直接上代码:
public class SaHyperlinkStyleEditUtils {
private boolean isShowUnderLine = true;
private int color = -1;
//用来设置监听事件,单击链接做自己的操作
private OnLinkClickListener onLinkClickListener;
public void setColor(int color) {
this.color = color;
}
/**
* 下划线显隐
*/
public void setIsShowUnderLine(boolean isShowUnderLine) {
this.isShowUnderLine = isShowUnderLine;
}
public void setUrl(TextView tv, String htmlLinkText, OnLinkClickListener onLinkClickListener) {
this.onLinkClickListener = onLinkClickListener;
//html 不识别\n 换行 所以得转换为<br>
htmlLinkText = htmlLinkText.replace("\n", "<br>");
// \t在与() 相遇是不识别,不知道什么鬼..所以加上空格替换,懂得可以说明下
htmlLinkText = htmlLinkText.replace("\t", " \t");
//string转化为html
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) {
MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
style.setSpan(myURLSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
tv.setText(style);
}
}
private class MyURLSpan extends ClickableSpan {
private String mUrl;
MyURLSpan(String url) {
mUrl = url;
}
@Override
public void onClick(View widget) {
if (onLinkClickListener != null) {
onLinkClickListener.onLinkClickListener(widget, mUrl);
}
}
/**
* 修改样式
*
* @param ds
*/
@Override
public void updateDrawState(TextPaint ds) {
if (color == -1) {
//默认色
ds.setColor(ds.linkColor);
} else {
//自定义样式
ds.setColor(color);
}
//下划线显示或隐藏 true 显示 false 隐藏
ds.setUnderlineText(isShowUnderLine);
}
}
/**
* 点击链接事件的监听
*/
public interface OnLinkClickListener {
void onLinkClickListener(View view, String url);
}
}