一个仿微博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 筛选,直接使用的工具类相关推荐

  1. Android TextView长按选择复制工具类

    开篇废话 最近有个需求,需要做一个像微信聊天一样可以长按可以任意选择复制的功能,这就要用到了Spannable了,但不止止的Spannable,在写的过程中也是遇到了很多的坑,为了避免大家踩坑,把我写 ...

  2. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  3. 实现一个在JNI中调用Java对象的工具类,从此只需一行代码

    前言 我们知道在jni中执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID ...

  4. 分享一个超全的基于jedis的redis工具类

    以下为部分代码,完整的代码和redis应用实例,请移步到码云. 码云地址:  spring-boot-redis-case: 基于redisUtils的各种redis应用实例 ps:try-final ...

  5. java做的一个将中文转换成Unicode码的工具类【转载】做个标记,明天研究下

    这两天在使用RBManager(一个开源工具,用于多国化字符转化)工具的时候觉得很不方便,有的时候只需要知道中文对应的unicode码是多少,不需要这么麻烦的操作,所以就自己写了一个工具,专门用于将中 ...

  6. 【手撸一个ORM】第八步、查询工具类

    一.实体查询 using MyOrm.Commons; using MyOrm.DbParameters; using MyOrm.Expressions; using MyOrm.Mappers; ...

  7. ArcObject Java:shape cad转换为Geojson,以及坐标系转换参数获取和转换,或者输出一个Path(线)的字符串(工具类)

    QQ交流群:607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考 ArcObject Java: (1)shape cad转换为Geojson (2)坐标系转换参数获取 (3)坐 ...

  8. ios仿微博个人首页

    前言 最近在公司拿到了一个仿微博个人主页效果的需求,于是在网上找了一个类似的demo.当时是直接拿来用的,之后空闲下来了,就研究了实现方法.于是写了这份笔记 分析 首先我们看看这个效果图 有以下几个特 ...

  9. 一款基于flutter的仿微博客户端(仿微博首页,视频页,聊天页面等)

    基于flutter的仿微博客户端 在学习了flutter之后,写了一个仿微博最新的10.4.0版本, 还原微博80%的界面 总共涉及到了几十个界面和接口,用到了flutter中的大部分组件 该项目分为 ...

最新文章

  1. mybatis10--自连接多对一查询
  2. LINQ的Union方法
  3. 多进程单线程模型与单进程多线程模型之争
  4. IDEA安装Spring Initializer插件
  5. 泛型在继承方面的体现与通配符
  6. html 禁用自动跳转,javascript 实现页面跳转,禁止返回上一页【转】
  7. (16)Zynq FPGA SD控制器介绍
  8. Navicat Premium 12快捷键
  9. 枫之谷m平板玩服务器维护,枫之谷 M无法连接服务器是什么原因
  10. cocos2dx 插件Babelua的配置和使用
  11. uc通讯不成功php版本过高,UC通信失败怎么办
  12. drupal主题开发_开发人员降低了Drupal的进入门槛
  13. 云计算技术基础复习知识点
  14. SQL实现 模糊查询
  15. 庖丁解牛linux内核,庖丁解牛Linux网络核心
  16. input的disabled属性
  17. 思科-交换机的基本命令
  18. 剪辑视频,在视频画面上编辑一张图片
  19. Android自定义注解不被混淆,Android 混淆压缩开启以及自定义混淆规则
  20. Long-term 3D Localization and Pose from Semantic Labellings

热门文章

  1. 关联分析/频繁项集挖掘:Apriori算法
  2. 中国首个开源基金会成立;京东 AI 研究院获 QuAC 机器阅读理解竞赛冠军
  3. 在学习c51单片机实验七(双机通信及pcb设计)操作Keil uVision4和protus的时候遇到的两个坑
  4. 什么是 Ubuntu?
  5. readtable matlab抬头,关于使用READ TABLE语句
  6. Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能
  7. Dirty Pipe – Linux 内核本地提权漏洞
  8. 土豪小米天价域名背后 互联网商业模式重组
  9. 基于jeeSite的软件测试课程作业 流程记录
  10. 国产手机操作系统艰难探索