Android实现高亮搜索功能的示例
作者:G_452 时间:2021-06-13 19:25:02
目录
首先看效果图:
使用方法:
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
标签:Android,高亮,搜索
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C语言实现2D赛车游戏的示例代码
2022-04-03 05:57:33
![](https://img.aspxhome.com/file/2023/4/117794_0s.jpg)
详解Android中点击事件的几种实现方式
2022-07-03 09:05:09
基于Spring p标签和c标签注入方式
2023-11-25 22:26:36
![](https://img.aspxhome.com/file/2023/7/109947_0s.png)
OpenCV画任意圆弧曲线
2023-06-22 19:28:44
![](https://img.aspxhome.com/file/2023/5/94045_0s.jpg)
android 通过MediaRecorder实现简单的录音示例
2023-07-29 06:03:54
C#(WinForm) ComboBox和ListBox添加项及设置默认选择项
2022-05-13 10:09:49
![](https://img.aspxhome.com/file/2023/2/94582_0s.png)
Java并发编程之Fork/Join框架的理解
2023-09-30 14:14:01
![](https://img.aspxhome.com/file/2023/9/75509_0s.png)
Java源码解析之详解ImmutableMap
2023-11-23 08:06:07
![](https://img.aspxhome.com/file/2023/3/59223_0s.png)
Java面试题冲刺第二十九天--JVM3
2021-05-24 05:34:26
![](https://img.aspxhome.com/file/2023/8/82308_0s.jpg)
C#操作DataTable的实现步骤
2021-06-04 13:20:23
![](https://img.aspxhome.com/file/2023/4/108624_0s.png)
java并发编程专题(六)----浅析(JUC)Semaphore
2023-07-27 23:30:28
Android生成带圆角的Bitmap图片
2022-09-08 11:18:19
Java png图片修改像素rgba值的操作
2022-08-11 06:57:21
C#用链式方法表达循环嵌套
2023-04-14 06:54:23
Android实现SQLite添加、更新及删除行的方法
2022-03-29 05:23:45
C#实现IDisposable接口释放非托管资源
2022-12-01 06:59:53
C#基于NPOI生成具有精确列宽行高的Excel文件的方法
2022-12-18 13:32:46
Android使用ContentResolver搜索手机通讯录的方法
2021-12-28 08:33:16
Java的Spring框架下的AOP编程模式示例
2023-11-02 00:52:25
![](https://img.aspxhome.com/file/2023/0/58710_0s.png)
Java实现最小生成树算法详解
2023-11-25 04:51:22
![](https://img.aspxhome.com/file/2023/8/59678_0s.png)