package com.campus.prime.ui.widget; import android.content.Context; import android.graphics.Color; import android.text.Html; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextPaint; 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 { private OnLinkClickListener mLinkClickListener = new LinkView.OnLinkClickListener() { @Override public void onLinkClick() { } }; 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 OnLinkClickListener getLinkClickListener() { return mLinkClickListener; } public void setLinkClickListener(OnLinkClickListener linkClickListener) { this.mLinkClickListener = linkClickListener; } 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) { if (!isNormalUrl(url)) { style.removeSpan(url);// ֻ��Ҫ�Ƴ�֮ǰ��URL��ʽ������������ NoLinkSpan span = new NoLinkSpan(url.getURL()); style.setSpan(span, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); continue; } 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); } public class MyURLSpan extends ClickableSpan { private String mUrl; public MyURLSpan(String url) { mUrl = url; } @Override public void onClick(View widget) { mLinkClickListener.onLinkClick(); /** URLs urls = URLs.parseURL(mUrl); if (urls != null) { UIHelper.showLinkRedirect(widget.getContext(), urls.getObjType(), urls.getObjId(), urls.getObjKey()); } else { UIHelper.openBrowser(widget.getContext(), mUrl); } **/ } } /** * ����Ӧ��ClickableSpan * * @author yeguozhong@yeah.net * */ public class NoLinkSpan extends ClickableSpan { private String text; public NoLinkSpan(String text) { super(); this.text = text; } @Override public void updateDrawState(TextPaint ds) { ds.setColor(Color.BLACK); ds.setUnderlineText(false); // ȥ���»��� } @Override public void onClick(View widget) { // doNothing... } } public interface OnLinkClickListener { void onLinkClick(); } /** * ���˵�һЩ������������ * * @param url * @return */ public boolean isNormalUrl(URLSpan url) { String urlStr = url.getURL(); if (urlStr.endsWith(".sh")) { return false; } return true; } }