有关微博content的封装实现详解
时间:2022-12-02 17:37:53
可以不用经过 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控件:https://www.jb51.net/article/32030.htm
标签:微博,content,封装
0
投稿
猜你喜欢
深入浅析java中finally的用法
2023-06-14 00:03:35
C#获取指定目录下指定文件的方法
2022-11-01 12:34:27
详解Spring依赖注入的三种方式使用及优缺点
2023-06-09 18:29:00
IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解
2022-02-28 09:44:47
Java图论进阶之最小生成树算法详解
2022-05-28 12:17:54
spring boot自带图片服务器使用详解
2021-11-07 07:49:39
Java创建线程的两种方式
2023-09-12 05:20:55
c#保存窗口位置大小操作类(序列化和文件读写功能)
2023-07-15 18:51:06
使用Spring的拦截器监测每个Controller或方法的执行时长
2021-12-19 16:36:01
Java继承的问题引导和测试代码
2023-03-13 18:50:34
C语言文件操作之fread函数详解
2023-07-06 18:24:15
spring hibernate实现动态替换表名(分表)的方法
2022-06-10 14:20:03
C++双向循环列表用法实例
2023-07-23 03:58:54
C# 两种方式反编译修改源码(dnspy,ildasm & ilasm)
2022-04-29 18:48:56
python、java等哪一门编程语言适合人工智能?
2021-06-04 03:22:53
Spring boot配置 swagger的示例代码
2023-03-07 13:10:44
Java线程编程中isAlive()和join()的使用详解
2023-10-29 18:08:07
C# 一个WCF简单实例
2023-07-12 20:53:43
C#判断当前程序是否通过管理员运行的方法
2023-09-27 15:48:24
分享几个Java工作中实用的代码优化技巧
2023-11-28 12:04:50