package net.oschina.app.widget;
import net.oschina.app.bean.URLs;
import net.oschina.app.common.UIHelper;
import android.content.Context;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
/**
* 超链接文本控件
* @author liux (http://my.oschina.net/liux)
* @version 1.0
* @created 2012-3-21
*/
public class LinkView extends TextView {
public LinkView(Context context) {
super(context);
}
public LinkView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LinkView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setLinkText(String linktxt){
Spanned span = Html.fromHtml(linktxt);
setText(span);
setMovementMethod(LinkMovementMethod.getInstance());
parseLinkText(span);
}
public void parseLinkText(Spanned spanhtml){
CharSequence text = getText();
if(text instanceof Spannable){
int end = text.length();
Spannable sp = (Spannable)getText();
URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
URLSpan[] htmlurls = spanhtml != null ? spanhtml.getSpans(0, end, URLSpan.class) : new URLSpan[]{};
if(urls.length == 0 && htmlurls.length == 0) return;
SpannableStringBuilder style = new SpannableStringBuilder(text);
//style.clearSpans();// 这里会清除之前所有的样式
for(URLSpan url : urls){
style.removeSpan(url);//只需要移除之前的URL样式,再重新设置
MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
style.setSpan(myURLSpan,sp.getSpanStart(url),sp.getSpanEnd(url),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
for(URLSpan url : htmlurls){
style.removeSpan(url);//只需要移除之前的URL样式,再重新设置
MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
style.setSpan(myURLSpan,spanhtml.getSpanStart(url),spanhtml.getSpanEnd(url),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
setText(style);
}
}
public void parseLinkText(){
parseLinkText(null);
}
private static class MyURLSpan extends ClickableSpan{
private String mUrl;
MyURLSpan(String url) {
mUrl =url;
}
@Override
public void onClick(View widget) {
URLs urls = URLs.parseURL(mUrl);
if(urls != null){
UIHelper.showLinkRedirect(widget.getContext(), urls.getObjType(), urls.getObjId(), urls.getObjKey());
}else{
UIHelper.openBrowser(widget.getContext(), mUrl);
}
}
}
}