Android实现高亮搜索功能的示例
作者:G_452 发布时间:2021-06-13 19:25:02
标签:Android,高亮,搜索
目录
首先看效果图:
使用方法:
1、普通场景使用
2、在DataBinding中使用
首先看效果图:
整词高亮:
分词高亮:
下面贴上我封的方法
/**
* 关键字高亮显示
* text 原文
* keyWord 需要高亮显示的关键字
* isCut 是否需要做分词高亮展示
* isCut = true 关键字里的每一个字,只要有都会高亮
* isCut = false(默认) 只有整词才会高亮
**/
fun stringToHighLight(text: String, keyWord: String, isCut: Boolean = false): SpannableStringBuilder {
val spannable = SpannableStringBuilder(text)
try {
var keyword: MutableList<String> = ArrayList()
if (isCut) {
for (i in keyWord.indices) {
keyword.add(keyWord.substring(i, i + 1))
}
} else {
keyword = arrayListOf(keyWord)
}
var span: CharacterStyle?
var wordReg: String
for (i in keyword.indices) {
var key = ""
if (keyword[i].contains("*") || keyword[i].contains("(") || keyword[i].contains(")")) {
val chars = keyword[i].toCharArray()
for (k in chars.indices) {
key = if (chars[k] == '*' || chars[k] == '(' || chars[k] == ')') {
key + "\\" + chars[k].toString()
} else {
key + chars[k].toString()
}
}
keyword[i] = key
}
wordReg = "(?i)" + keyword[i]
val pattern: Pattern = Pattern.compile(wordReg)
val matcher: Matcher = pattern.matcher(text)
while (matcher.find()) {
span = ForegroundColorSpan(Color.parseColor("#4599F7"))
spannable.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_MARK_MARK)
}
}
} catch (e: Exception) {
LogUtil.d("stringToHighLight-Error-------->$e")
}
return spannable
}
使用方法:
1、普通场景使用
//整词搜索 isCut可不传
stringToHighLight("原文", "关键字")
//分词搜索
stringToHighLight("原文", "关键字",true)
2、在DataBinding中使用
1):定义BindingAdapter
@BindingAdapter("app:setHighLightText", "app:setHightkeyWord")
fun setHighLightText(view: TextView, content: String?, keyWord: String) {
content?.let { view.text = stringToHighLight(it, keyWord) }
}
2):在xml中绑定
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@{itemmodel.isRead?@color/readColor:@color/noreadColor}"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent"
app:setHighLightText="@{itemmodel.title}"
app:setHightkeyWord="@{viewmodel.keyString}" />
搞定!
来源:https://juejin.cn/post/6959484197178179621


猜你喜欢
- 日期格式化标准 DateTime 格式字符串如果格式字符串只包含下表列出的某个单个格式说明符,则它们被解释为标准格式说明符。如果指定的格式字
- 前言:在 Java 语言中,保证线程安全性的主要手段是加锁,而 Java 中的锁主要有两种:synchronized 和 Lock,我们今天
- servlet、filter、listener、interceptor之间的区别和联系一、概念1.servlet:servlet是一种运行服
- Map接口存储特点以键(key)值(value)对的形式存储键无序、无下标、元素不可重复值无序、无下标、元素可以重复常用实现类HashMap
- 以下是SpringBoot项目中的常用配置类、jar包坐标等通用配置pom文件<!-- --><!-- 自定义配置文件
- 本文实例讲述了C#导出数据到csv文件的通用类。分享给大家供大家参考。具体如下:通过这个类可以很简单的定义数据格式,并导出到csv文件//这
- 提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型:1.常用的值类型有:(struct)整型家族:int,byte,char
- Android读取资源文件的方法1、放入到资源文件夹里面,也就是所创建android工程的res下面。
- Java中的main函数的详细介绍JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,
- 本文实例为大家分享了Android使用AIDL方式实现播放音乐的具体代码,供大家参考,具体内容如下思路:① 新建两个APP项目或者Modul
- 如下所示:package cn.jdk.foreach;import java.util.HashMap;import java.util.
- 一、项目简述本系统功能包括:通知公告,老人管理,护工管理,问答管理等等功能。二、项目运行环境配置: Jdk1.8 + Tomcat8.5 +
- 目录开启定时任务注解@EnableScheduling@Scheduled添加定时任务Cron表达式在线cron工具适应场景springBo
- 假如使用绝对路径,没有任何问题,就是移植性不太好。假如使用相对路径,则要注意当前路径“.”是在哪儿?一般我们都会在配置文件中加入log文件的
- 现有的热修复框架很多,尤以AndFix 和Tinker比较多具体的实现方式和项目引用可以参考网络上的文章,今天就不谈,也不是主要目的今天就来
- 最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型
- 本文实例讲述了Java二叉搜索树基础原理与实现方法。分享给大家供大家参考,具体如下:前言:本文通过先通过了解一些二叉树基础知识,然后在转向学
- 本篇博客给大家分享一个效果比较好的侧滑菜单的Demo,实现点击左边菜单切换Fragment。效果如下: 主Activity代码:p
- 序言之前封装过一个日志注解,打印方法执行信息,功能较为单一不够灵活,近来兴趣来了,想重构下,使其支持表达式语法,以应对灵活的日志打印需求。该
- 本文介绍一个C#函数,可以实现计算文件的MD5值,可以用于文件传输后进行有效性校验。我们知道可以通过将一个字符串进行散列(Hash)运算得到