关于 微博 content 的封装实现
可以不用经过 Html.fromHtml 因为我的数据里面含有一点 html的标签。所以经过html转换了。
实现方法:
TextView content = (TextView) convertView.findViewById(R.id.content); content.setText(Html.fromHtml("<html><head>"+temp.get(position).getContent()+"</html></head>")); CharSequence str = content.getText(); SpannableString spann = WeiboUtils.formatContentNoClick(str); content.setText(spann);
具体的封装如下:
package com.lizheng.little.yiqu.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.lizheng.little.yiqu.ui.ActWeiBoInfo; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.text.SpannableString; import android.text.Spanned; import android.text.style.ClickableSpan; import android.text.style.ForegroundColorSpan; import android.view.View; public class WeiboUtils { /** * 将text中@某人、#某主题、http://网址的字体加亮,匹配的表情文字以表情显示 * @param text * @param context * @return*/ public static SpannableString formatContent(CharSequence text,Context context) { SpannableString spannableString = new SpannableString(text); /* * @[^\\s::]+[::\\s] 匹配@某人 * #([^\\#|.]+)# 匹配#某主题 http://t\\.cn/\\w+ 匹配网址 */ Pattern pattern = Pattern.compile("@[^\\s::]+[::\\s]|#([^\\#|.]+)#|http://t\\.cn/\\w"); Matcher matcher = pattern.matcher(spannableString); final Context mcontext = context; while (matcher.find()) { final String match=matcher.group(); if(match.startsWith("@")){ //@某人,加亮字体 spannableString.setSpan(new ClickableSpan() { // 在onClick方法中可以编写单击链接时要执行的动作 @Override public void onClick(View widget) { String username = match; username = username.replace("@", ""); username = username.replace(":", ""); username = username.trim(); Intent intent = new Intent(mcontext,XXX.class); ConstantsUtil.clickName = username; mcontext.startActivity(intent);//跳转到用户信息界面 } }, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(0xff0077ff), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else if(match.startsWith("#")){ //#某主题 spannableString.setSpan(new ClickableSpan() { // 在onClick方法中可以编写单击链接时要执行的动作 @Override public void onClick(View widget) { String theme = match; theme = theme.replace("#", ""); theme = theme.trim(); ConstantsUtil.clickName = theme; Intent intent = new Intent(mcontext,XXX.class); mcontext.startActivity(intent);//跳转到话题信息界面 } }, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(0xff0077ff), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else if(match.startsWith("http://")){ //匹配网址 spannableString.setSpan(new ClickableSpan() { // 在onClick方法中可以编写单击链接时要执行的动作 @Override public void onClick(View widget) { Uri uri = Uri.parse(match); Intent intent = new Intent(Intent.ACTION_VIEW, uri); mcontext.startActivity(intent); } }, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(0xff0077ff), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } return spannableString; } public static SpannableString formatContentNoClick(CharSequence text) { SpannableString spannableString = new SpannableString(text); /* * @[^\\s::]+[::\\s] 匹配@某人 * #([^\\#|.]+)# 匹配#某主题 http://t\\.cn/\\w+ 匹配网址 */ Pattern pattern = Pattern.compile("@[^\\s::]+[::\\s]|#([^\\#|.]+)#|http://t\\.cn/\\w"); Matcher matcher = pattern.matcher(spannableString); while (matcher.find()) { final String match=matcher.group(); if(match.startsWith("@")){ //@某人,加亮字体 spannableString.setSpan(new ForegroundColorSpan(0xff0077ff), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else if(match.startsWith("#")){ //#某主题 spannableString.setSpan(new ForegroundColorSpan(0xff0077ff), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else if(match.startsWith("http://")){ //匹配网址 spannableString.setSpan(new ForegroundColorSpan(0xff0077ff), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } return spannableString; } public static long calculateWeiboLength(CharSequence c) { double len = 0; for (int i = 0; i < c.length(); i++) { int temp = (int)c.charAt(i); if (temp > 0 && temp < 127) { len += 0.5; }else{ len ++; } } return Math.round(len); } }
自己封装的dialog控件:http://www.cnblogs.com/nuliniaoboke/archive/2012/11/16/2773278.html