关于 微博 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构