一个仿微博TextView 筛选,直接使用的工具类
一个仿微博TextView 筛选,直接使用的工具类
package com.example.textviewhtml;import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class TextViewUtils {private static final String AT = "@[\u4e00-\u9fa5\\w]+";// @人//private static final String TOPIC = "#[\u4e00-\u9fa5\\w]+#";// ##话题//private static final String TOPIC = "#[\\p{Print}\\p{InCJKUnifiedIdeographs}&&[^#]]+#";// ##话题private static final String TOPIC = "#([^#]+?)#";// ##话题private static final String EMOJI = "\\[[\u4e00-\u9fa5\\w]+\\]";// 表情private static final String URL = "http://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";// urlprivate static final String REGEX = "(" + AT + ")" + "|" + "(" + TOPIC + ")" + "|" + "(" + URL + ")" ;public static class MyClickableSpan extends ClickableSpan {@Overridepublic void onClick(View widget) {}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setColor(Color.BLUE);ds.setUnderlineText(false);}}/*** 设置微博内容样式* @param context* @param source* @param textView* @return*/public static SpannableString getWeiBoContent(final Context context, String source, TextView textView) {SpannableString spannableString = new SpannableString(source);//设置正则Pattern pattern = Pattern.compile(REGEX);Matcher matcher = pattern.matcher(spannableString);if (matcher.find()) {// 要实现文字的点击效果,这里需要做特殊处理textView.setMovementMethod(LinkMovementMethod.getInstance());// 重置正则位置matcher.reset();}while (matcher.find()) {// 根据group的括号索引,可得出具体匹配哪个正则(0代表全部,1代表第一个括号)final String at = matcher.group(1);final String topic = matcher.group(2);//String emoji = matcher.group(3);final String url = matcher.group(3);// 处理@符号if (at != null) {//获取匹配位置int start = matcher.start(1);int end = start + at.length();MyClickableSpan clickableSpan = new MyClickableSpan() {@Overridepublic void onClick(View widget) {//这里需要做跳转用户的实现,先用一个Toast代替Toast.makeText(context, "点击了用户:" + at, Toast.LENGTH_LONG).show();}};spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}// 处理话题##符号if (topic != null) {int start = matcher.start(2);int end = start + topic.length();MyClickableSpan clickableSpan = new MyClickableSpan() {@Overridepublic void onClick(View widget) {Toast.makeText(context, "点击了话题:" + topic, Toast.LENGTH_LONG).show();}};spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}
/*if (emoji != null) {int start = matcher.start(3);int end = start + emoji.length();int ResId = EmotionUtils.getImgByName(emoji);Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), ResId);if (bitmap != null) {// 获取字符的大小int size = (int) textView.getTextSize();// 压缩Bitmapbitmap = Bitmap.createScaledBitmap(bitmap, size, size, true);// 设置表情ImageSpan imageSpan = new ImageSpan(context, bitmap);spannableString.setSpan(imageSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}*/// 处理url地址if (url != null) {int start = matcher.start(3);int end = start + url.length();MyClickableSpan clickableSpan = new MyClickableSpan() {@Overridepublic void onClick(View widget) {Toast.makeText(context, "点击了网址:" + url, Toast.LENGTH_LONG).show();}};spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}return spannableString;}
}
一个仿微博TextView 筛选,直接使用的工具类相关推荐
- Android TextView长按选择复制工具类
开篇废话 最近有个需求,需要做一个像微信聊天一样可以长按可以任意选择复制的功能,这就要用到了Spannable了,但不止止的Spannable,在写的过程中也是遇到了很多的坑,为了避免大家踩坑,把我写 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- 实现一个在JNI中调用Java对象的工具类,从此只需一行代码
前言 我们知道在jni中执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID ...
- 分享一个超全的基于jedis的redis工具类
以下为部分代码,完整的代码和redis应用实例,请移步到码云. 码云地址: spring-boot-redis-case: 基于redisUtils的各种redis应用实例 ps:try-final ...
- java做的一个将中文转换成Unicode码的工具类【转载】做个标记,明天研究下
这两天在使用RBManager(一个开源工具,用于多国化字符转化)工具的时候觉得很不方便,有的时候只需要知道中文对应的unicode码是多少,不需要这么麻烦的操作,所以就自己写了一个工具,专门用于将中 ...
- 【手撸一个ORM】第八步、查询工具类
一.实体查询 using MyOrm.Commons; using MyOrm.DbParameters; using MyOrm.Expressions; using MyOrm.Mappers; ...
- ArcObject Java:shape cad转换为Geojson,以及坐标系转换参数获取和转换,或者输出一个Path(线)的字符串(工具类)
QQ交流群:607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考 ArcObject Java: (1)shape cad转换为Geojson (2)坐标系转换参数获取 (3)坐 ...
- ios仿微博个人首页
前言 最近在公司拿到了一个仿微博个人主页效果的需求,于是在网上找了一个类似的demo.当时是直接拿来用的,之后空闲下来了,就研究了实现方法.于是写了这份笔记 分析 首先我们看看这个效果图 有以下几个特 ...
- 一款基于flutter的仿微博客户端(仿微博首页,视频页,聊天页面等)
基于flutter的仿微博客户端 在学习了flutter之后,写了一个仿微博最新的10.4.0版本, 还原微博80%的界面 总共涉及到了几十个界面和接口,用到了flutter中的大部分组件 该项目分为 ...
最新文章
- mybatis10--自连接多对一查询
- LINQ的Union方法
- 多进程单线程模型与单进程多线程模型之争
- IDEA安装Spring Initializer插件
- 泛型在继承方面的体现与通配符
- html 禁用自动跳转,javascript 实现页面跳转,禁止返回上一页【转】
- (16)Zynq FPGA SD控制器介绍
- Navicat Premium 12快捷键
- 枫之谷m平板玩服务器维护,枫之谷 M无法连接服务器是什么原因
- cocos2dx 插件Babelua的配置和使用
- uc通讯不成功php版本过高,UC通信失败怎么办
- drupal主题开发_开发人员降低了Drupal的进入门槛
- 云计算技术基础复习知识点
- SQL实现 模糊查询
- 庖丁解牛linux内核,庖丁解牛Linux网络核心
- input的disabled属性
- 思科-交换机的基本命令
- 剪辑视频,在视频画面上编辑一张图片
- Android自定义注解不被混淆,Android 混淆压缩开启以及自定义混淆规则
- Long-term 3D Localization and Pose from Semantic Labellings
热门文章
- 关联分析/频繁项集挖掘:Apriori算法
- 中国首个开源基金会成立;京东 AI 研究院获 QuAC 机器阅读理解竞赛冠军
- 在学习c51单片机实验七(双机通信及pcb设计)操作Keil uVision4和protus的时候遇到的两个坑
- 什么是 Ubuntu?
- readtable matlab抬头,关于使用READ TABLE语句
- Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能
- Dirty Pipe – Linux 内核本地提权漏洞
- 土豪小米天价域名背后 互联网商业模式重组
- 基于jeeSite的软件测试课程作业 流程记录
- 国产手机操作系统艰难探索