欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

有关微博content的封装实现详解

程序员文章站 2023-12-09 15:21:09
可以不用经过 html.fromhtml 因为我的数据里面含有一点 html的标签。所以经过html转换了。 实现方法: 复制代码 代码如下: textview conte...
可以不用经过 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控件: