package com.smartandroid.sa.view; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.TextView; public class WeiboView extends TextView { private Context c; private static Activity activity; public WeiboView(Context context) { // TODO Auto-generated method stub super(context); this.c = context; } public WeiboView(Context context, AttributeSet attrs) { // TODO Auto-generated method stub super(context, attrs); this.c = context; } public WeiboView(Context context, AttributeSet attrs, int defStyle) { // TODO Auto-generated method stub super(context, attrs, defStyle); this.c = context; } public void getVText() { // Spannable // SpannableString // SpannableStringBuilder // Spanned // SpanWatcher // Pattern // Patterns // PatternMatcher // ClickableSpan // ForegroundColorSpan // ImageSpan } public static void setJump(Activity Jumpactivity) { activity = Jumpactivity; } public static void setVViewText(Context mContext, WeiboView vview, String content, boolean hasClick) { List<TextItem> list = paresString2(content); Spannable span = new SpannableString(content); for (TextItem ti : list) { if (ti.getPrefixType() == 1) {// @ span.setSpan(new TCSapn(mContext, ti), ti.start, ti.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // //���ü������ // try { // Field f = (Field) // R.drawable.class.getDeclaredField(imageName); // int eId = f.getInt(R.drawable.class); // Drawable drawable = mContext.getResources().getDrawable(eId); // if (drawable != null) { // drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), // drawable.getIntrinsicHeight()); // ImageSpan imgSpan = new ImageSpan(drawable, // ImageSpan.ALIGN_BASELINE); // span.setSpan(imgSpan, pi.start, pi.end, // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // } else { // span.setSpan(new ForegroundColorSpan(Color.BLUE), pi.start, // pi.end, // Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // } // } catch (Exception e) { // // TODO: handle exception // span.setSpan(new ForegroundColorSpan(Color.BLUE), pi.start, // pi.end, // Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // } // } else { // if (hasClick) // span.setSpan(new TextClickSapn(mContext, pi), pi.start, // pi.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // else // span.setSpan(new ForegroundColorSpan(Color.BLUE), pi.start, // pi.end, // Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } vview.setText(span); if (hasClick) vview.setMovementMethod(LinkMovementMethod.getInstance()); } private static class TCSapn extends ClickableSpan { private TextItem item; private Context mContext; public TCSapn(Context context, TextItem item) { // TODO Auto-generated constructor stub this.item = item; this.mContext = context; } @Override public void updateDrawState(TextPaint ds) { // TODO Auto-generated method stub super.updateDrawState(ds); // ds.setColor(ds.linkColor); ds.setUnderlineText(false); } @Override public void onClick(View widget) { // TODO Auto-generated method stub switch (item.getPrefixType()) { case 1:// @ Intent it_person = new Intent(mContext, activity.getClass()); it_person.putExtra("content", item.getContentWithoutPrefix()); Log.i("info", item.getContentWithoutPrefix()); mContext.startActivity(it_person); break; case 2: Intent it_topic = new Intent(mContext, activity.getClass()); it_topic.putExtra("content", item.getContentWithoutPrefix()); mContext.startActivity(it_topic); break; case 3: // ֱ��ʹ�õ�������� // ����Ƕ��� ������Ҫ����΢���ӿڣ�ת��ԭʼ���� ���ܷ��� // ��ʹ�ö���ȥ���ýӿڣ���ȡ����������������� Intent intent = new Intent(); // intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse("http://www.sina.com"); intent = new Intent(Intent.ACTION_VIEW); intent.setData(content_url); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); break; default: break; } } } public static List<TextItem> paresString(String content) {// ���� String regex = "@[^\\s:����]+([\\s:����]|$)|#(.+?)#|http://t\\.cn/\\w+|\\[(.*?)\\]"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); boolean b = m.find(); List<TextItem> list = new ArrayList<TextItem>(); while (b) { System.out.println(m.start()); System.out.println(m.end()); System.out.println(m.group()); int start = m.start(); int end = m.end(); String str = m.group(); list.add(new TextItem(start, end, str, content.length())); b = m.find(m.end() - 1); } return list; } public static List<TextItem> paresString2(String content) { String regex = "@[^\\s:����]+([\\s:����]|$)|#(.+?)#|http://t\\.cn/\\w+|\\[(.*?)\\]"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); boolean b = m.find(); List<TextItem> list = new ArrayList<TextItem>(); int count = 0; int lastIndex = 0; while (b) { System.out.println(m.start()); System.out.println(m.end()); System.out.println(m.group()); int start = m.start(); int end = m.end(); String str = m.group(); if (str.startsWith("#")) { count++; if (count % 2 == 0) { b = m.find(lastIndex); continue; } } list.add(new TextItem(start, end, str, content.length())); b = m.find(m.end() - 1); try { lastIndex = m.start() + 1; } catch (Exception e) { // TODO: handle exception } } return list; } public static class TextItem { public int start; public int end; private int prefixType; private String content; private int strLenght; public TextItem(int start, int end, String content, int strLenght) { // TODO Auto-generated constructor stub this.start = start; this.end = end; this.content = content; this.strLenght = strLenght; } public TextItem(int start, int end, String content) { // TODO Auto-generated constructor stub this.start = start; this.end = end; this.content = content; } public String getContent() { return content; } public String getContentWithoutPrefix() { switch (getPrefixType()) { case 1: if (end == strLenght) return content.substring(1, strLenght); return content.substring(1, content.length() - 1); case 2: return content.substring(1, content.length() - 1); case 3: return content; default: return content; } } /** * 1 @ ���� 2 # ���� 3 http://t.cn/ ���� 4 [ ���� * * @return */ public int getPrefixType() { if (content.startsWith("@")) return 1; if (content.startsWith("#")) return 2; if (content.startsWith("http://")) return 3; if (content.startsWith("[")) return 4; return -1; } } }