自定义高亮文字的textview,匹配关键字词高亮,匹配可拆分的字词高亮

自定义高亮文字的textview,匹配关键字词高亮,匹配可拆分的字词高亮

import android.graphics.Color;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class HighlightTextView {// 高亮文本public static void highlightTextView(TextView textView, String text, String keyword) {// 将文本和关键字转换为 SpannableStringSpannableString spannableText = new SpannableString(text);// 创建 ForegroundColorSpan 并设置高亮颜色ForegroundColorSpan highlightSpan = new ForegroundColorSpan(Color.RED);// 编译正则表达式模式Pattern pattern = Pattern.compile(keyword);// 进行正则表达式匹配Matcher matcher = pattern.matcher(text);while (matcher.find()) {// 在匹配到的部分添加高亮标记spannableText.setSpan(highlightSpan, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}// 设置 TextView 的文本为带有高亮标记的 SpannableStringtextView.setText(spannableText);}// 示例用法public static void main(String[] args) {TextView textView = findViewById(R.id.textView);String text = "这是一个示例文本";String keyword = "示";highlightTextView(textView, text, keyword);}
}

import android.graphics.Color;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;public class HighlightTextView {// 高亮文本public static void highlightTextView(TextView textView, String text, String[] keywords) {// 将文本转换为 SpannableStringSpannableString spannableText = new SpannableString(text);// 创建 ForegroundColorSpan 并设置高亮颜色ForegroundColorSpan highlightSpan = new ForegroundColorSpan(Color.RED);for (String keyword : keywords) {// 对每个关键字进行正则表达式匹配和高亮处理Pattern pattern = Pattern.compile(keyword);Matcher matcher = pattern.matcher(text);while (matcher.find()) {spannableText.setSpan(highlightSpan, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}}// 设置 TextView 的文本为带有高亮标记的 SpannableStringtextView.setText(spannableText);}// 示例用法public static void main(String[] args) {TextView textView = findViewById(R.id.textView);String text = "这是一个示例文本";String[] keywords = {"示", "例"}; highlightTextView(textView, text, keywords);}
}

为什么只匹配高亮最后一个词呢,前面匹配的都没有高亮

在上面提供的示例代码中,为了为每个关键词都做高亮处理,需要在匹配到关键词时都对其进行Span设置。但是,在示例代码中进行Span设置时,每次设置新的Span时会覆盖之前设置的Span,因此只会显示最后一个匹配到的关键词的高亮效果。

要解决这个问题,可以修改为为每个匹配关键词的区间都创建一个新的Span,而不是覆盖之前的Span。以下是更新后的代码:

public void setHighlightedText(String fullText, String highlightText, String[] keywords) {this.fullText = fullText;this.highlightText = highlightText;SpannableStringBuilder spannable = new SpannableStringBuilder(fullText);for (String keyword : keywords) {Pattern pattern = Pattern.compile(Pattern.quote(keyword), Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(fullText);while (matcher.find()) {ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);spannable.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}setText(spannable);
}

在上述代码中,while (matcher.find()) 循环中会从第一个匹配到的关键词开始,所以第一个关键词可能会有高亮效果覆盖或遗漏。要解决这个问题,可以按照以下方式调整代码:

public void setHighlightedText(String fullText, String highlightText, String[] keywords) {this.fullText = fullText;this.highlightText = highlightText;SpannableStringBuilder spannable = new SpannableStringBuilder(fullText);for (String keyword : keywords) {Pattern pattern = Pattern.compile(Pattern.quote(keyword), Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(spannable);while (matcher.find()) {ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);spannable.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}setText(spannable);
}

通过添加 (?i) 到正则表达式中,我们可以确保不区分大小写地匹配关键词。这样可以保证所有关键词都能够被正确地高亮显示,包括第一个关键词

public void setHighlightedText(String fullText, String highlightText, String[] keywords) {this.fullText = fullText;this.highlightText = highlightText;SpannableStringBuilder spannable = new SpannableStringBuilder(fullText);for (String keyword : keywords) {Pattern pattern = Pattern.compile("(?i)" + Pattern.quote(keyword));Matcher matcher = pattern.matcher(spannable);while (matcher.find()) {ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);spannable.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}setText(spannable);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis3源码深度解析(十九)MyBatis日志实现

文章目录 前言第七章 MyBatis日志实现7.1 Java日志体系7.1.1 常用日志框架7.1.2 Java日志发展史7.1.3 日志接口与日志实现的绑定 7.2 MyBatis日志实现7.2.1 Log接口7.2.2 LogFactory工厂7.2.3 MyBatis日志自动查找7.2.4 MyBatis日志类型配置 7.3 小结 前言 日志是Java应用中必…

蓝桥算法练习系统—卡勒沃夫之弱水路三千(提高型)(拓扑排序)

问题描述 锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻   天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误   ......   在卡勒沃夫充满文学杀伤力的声音中,身处紫荆2号楼202B的四位远近高低各不同的室友纷纷回忆起了各自波澜起伏的过…

【合合TextIn】深度解析智能文档处理技术与应用

目录 一、智能文档处理介绍 二、文档格式解析 三、图像增强技术解析 四、传统文字识别OCR技术解析 五、深度学习OCR技术解析 六、深度学习版面分析技术解析 七、文档分类 八、信息抽取 九、系统集成:将IDP处理后的数据集成到企业系统 结论 一、智能文档处…

机器学习-06-无监督算法-01-划分聚类Kmeans算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中无监督算法,包括划分聚类等。 参考 数据分析实战 | K-means算法——蛋白质消费特征分析 欧洲48国英文名称的来龙去脉及其国旗动画 Kmeans在线动态演示 本门课程的目标 完成一个特定行业的…

如何与手机共享笔记本电脑的互联网?这里提供详细步骤

这篇文章介绍了如何通过将手机变成Wi-Fi热点来与手机共享笔记本电脑的互联网连接。 如何共享笔记本电脑的互联网连接 你可以通过Wi-Fi或有线共享笔记本电脑的数据连接,具体取决于你的设置。 Windows Windows允许你通过ICS共享你的互联网连接。ICS,或称互联网连接共享,是W…

ARM Coresight 系列文章 11.1 -- CoreSight Cortex-M33 CTI 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 CTI 的工作原理CTI 主要特点CTI的使用场景CTI 的工作原理 CTI 允许不同的调试和追踪组件之间基于特定事件进行交互。例如,当一个断点被命中时,CTI 可以用来触发内存的追踪捕捉或者外部仪器的行为,反之亦然。这种…

java项目的文件结构

java项目的文件结构 commomconfigcontorlledtoentity 在一个典型的 Java 项目中,通常会遵循一定的文件结构约定, 以下是一个常见的 Java 项目文件结构示例:/YourProjectName/src/main/java/com/example/projectMain.java/resourcesconfig.pro…

【华大 HC32L110】调用`printf`和串口接收中断的冲突问题解决

华大单片机 HC32L110调用printf和串口接收中断的冲突问题解决,经过查找是官方库 去使能了 串口的接收功能,记录解决问题的过程 目录 1.硬件MCU资料2. printf和串口接收中断的冲突解决3.重新封装 fputc 函数4.查找问题,发现是官方库配置有误5.…

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…

AWS ECS安全更新及自动化应对方案

AWS发布了一些重要的安全补丁,旨在修复ECS中发现的一些漏洞和问题。这些更新涉及多个方面,包括服务配置、任务定义等。为了确保我们的应用程序和基础设施的安全性,我们有必要及时采纳这些更新。 在本文中,我将分享一段Python代码,它利用AWS SDK(Boto3)与ECS进行交互,自动强制为…

探索海外市场舆情:云手机助力企业赢得全球竞争

在全球化的趋势下,越来越多的企业将目光投向海外市场,迎接着无尽的商机与挑战。然而,随之而来的是境外市场舆情的复杂变化,对企业的声誉和发展带来了潜在风险。如何准确、及时地掌握境外市场的舆情动向,成为了企业必须…

Midjourney发布新特性风格参考

1. 引言 最近,Midjourney 推出了Style Reference V2.0 即功能更加强大的风格参考工具,该工具可以让大家参考其他图像的风格,生成与参考图像风格保持一致,与文本提示词语义内容保持一致的图像。它与图像提示类似,但是只…

上位机开发使用的编程语言多种多样,每种语言都有其独特的优缺点。

上位机开发所使用的编程语言多种多样,每一种语言都有其独特的优势和适用场景。目前,没有明确的、统一的“上位机编程语言排行榜”,因为编程语言的选择很大程度上取决于项目的具体需求、开发团队的技能和经验,以及语言的性能和易用…

Day03-数据库管理(事务管理,用户管理,MySQL8的部分新特性)

文章目录 Day03 数据库管理学习目标1. 事务管理1.1 事务的概念1.2 事务的特性1.3 语法1.4 事务的并发问题1.5 事务隔离级别1.6 设置和查看隔离级别 2 用户管理2.1 创建删除用户2.2 权限管理2.2.1 权限赋予的原则2.2.2 权限赋予2.2.3 权限回收2.2.4 登录管理 3. MySQL8的部分新特…

Java中的I/O讲解(超容易理解)(下篇)

如果想观看更多Java内容 可上我的个人主页关注我,地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?typeblog 使用工具 IntelliJ IDEA Community Edition 2023.1.4 使用语言 Java8 代码能力快速提升小方法,看完代码自己敲一遍&#xff0…

web蓝桥杯真题:为图片添加景深效果

代码: // 请在这里编写代码,根据需求,使得图片达到景深效果 document.querySelector(.img1).style.filter blur(0px) document.querySelector(.img2).style.filter blur(0px) 知识点: 元素模糊 div {filter: blur(0px) /…

简易指南:国内ip切换手机软件怎么弄

在网络访问受到地域限制的情况下,使用国内IP切换手机软件可以帮助用户轻松访问被屏蔽的内容,扩展网络体验。以下是虎观代理小二分享的使用国内IP切换手机软件的简易指南。并提供一些注意事项。 如何在手机上使用国内IP切换软件 步骤一:选择I…

idea2023 运行多 springboot 实例

概要 1、修改idea运行多实例(本地测试负载) 你可能用到其他 1、改造项目缓存token 至redis 支持负载均衡部署 SpringSecurity6.0RedisJWTMP基于token认证功能开发(源码级剖析可用于实际生产项目)_springsecurity redis管理token…

嵌入式学习第二十九天!(数据结构的概念、单向链表)

数据结构: 1. 定义: 一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据) 1. 程序设计: 将现实中大量而复杂的问题以特定的数据类型和特定的数据结构存储在内存中,并在此基础上实现某个特定的功…

深入理解 Session、Cookie 和 Token:网络安全和身份验证的重要概念

深入理解 Session、Cookie 和 Token:网络安全和身份验证的重要概念 在当今数字化的世界中,网络安全和身份验证是至关重要的议题。为了实现这些目标,我们常常使用诸如 Session、Cookie 和 Token 等概念。这些概念在 Web 开发、网络通信和安全…