有关微博content的封装实现详解
程序员文章站
2023-12-15 20:40:58
可以不用经过 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控件:
实现方法:
复制代码 代码如下:
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控件: