先上图看效果
表情只弄了一个,测试使用, 新浪微博接口中返回那么多表情 - - 还没处理,好像新浪微博客户端也有些没有处理到
正则不会处理#的问题
如 : 其他文字#要的#不要的#要的#其他文字
最后会把 不要的 也给匹配到,
我用了笨点的方法处理了。。。
发关键代码,其他的下载附件 = =
TextUtils.java
- package com.zeng.span2.util;
- import java.lang.ref.SoftReference;
- import java.lang.reflect.Field;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import android.app.Activity;
- import android.content.Context;
- import android.content.Intent;
- import android.graphics.Color;
- import android.graphics.drawable.Drawable;
- import android.net.Uri;
- import android.text.Spannable;
- import android.text.SpannableString;
- import android.text.Spanned;
- import android.text.method.LinkMovementMethod;
- import android.text.style.ClickableSpan;
- import android.text.style.ForegroundColorSpan;
- import android.text.style.ImageSpan;
- import android.view.View;
- import android.widget.TextView;
- import com.zeng.span2.R;
- import com.zeng.span2.TestPersonActivity;
- import com.zeng.span2.TestTopicActivity;
- import com.zeng.span2.model.Emotion;
- /**
- * 处理字体高亮
- *
- * @author zeng
- *
- */
- public class TextUtils {
- private static List<Emotion> emotions = new ArrayList<Emotion>();
- /**
- *
- * @param mContext
- * @param textview
- * @param content
- * @param hasClick
- * 是否添加click
- */
- public static void textViewSpan(Context mContext, TextView textview, String content, boolean hasClick) {
- List<PositionItem> list = paresString2(content);
- Spannable span = new SpannableString(content);
- // 测试表情
- Emotion emotion = new Emotion(
- "http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_org.gif", "[草泥马]");
- if (emotions.isEmpty())
- emotions.add(emotion);
- // 结束测试
- for (PositionItem pi : list) {
- if (pi.getPrefixType() == 4) {
- String imageName = "";
- for (Emotion em : emotions) {
- if (em.getPhrase().equals(pi.getContent())) {
- imageName = em.getSaveName2();
- break;
- }
- }
- //
- 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);
- }
- }
- textview.setText(span);
- if (hasClick)
- textview.setMovementMethod(LinkMovementMethod.getInstance());
- }
- public static List<PositionItem> 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<PositionItem> list = new ArrayList<PositionItem>();
- 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 PositionItem(start, end, str, content.length()));
- b = m.find(m.end() - 1);
- }
- return list;
- }
- /**
- * 这个是处理一条信息有多个#...
- *
- * @param content
- * @return
- */
- public static List<PositionItem> 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<PositionItem> list = new ArrayList<PositionItem>();
- 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 PositionItem(start, end, str, content.length()));
- b = m.find(m.end() - 1);
- try {
- lastIndex = m.start() + 1;
- } catch (Exception e) {
- // TODO: handle exception
- }
- }
- return list;
- }
- private static class TextClickSapn extends ClickableSpan {
- private PositionItem item;
- private Context mContext;
- public TextClickSapn(Context context, PositionItem item) {
- // TODO Auto-generated constructor stub
- this.item = item;
- this.mContext = context;
- }
- @Override
- public void onClick(View widget) {
- // TODO Auto-generated method stub
- switch (item.getPrefixType()) {
- case 1:
- Intent it_person = new Intent(mContext, TestPersonActivity.class);
- it_person.putExtra("content", item.getContentWithoutPrefix());
- mContext.startActivity(it_person);
- break;
- case 2:
- Intent it_topic = new Intent(mContext, TestTopicActivity.class);
- 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 class PositionItem {
- public int start;
- public int end;
- private int prefixType;
- private String content;
- private int strLenght;
- public PositionItem(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 PositionItem(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;
- }
- }
- }
若有好的办法处理#的问题,求告知!
下面是附件连接
http://download.csdn.net/download/zgf1991/4888699
点击打开链接