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}" />

搞定!

以上就是Android实现高亮搜索功能的示例的详细内容,更多关于Android实现高亮搜索的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android本地实现搜索历史记录

    本文实例为大家分享了Android本地实现搜索历史记录的具体代码,供大家参考,具体内容如下 一.自定义搜索历史记录 本地实现搜索历史记录有很多种方法,下面不多说了,我们来用SQLite来实现此功能,直接上完整代码:点击下载源码 效果一: 效果二: 1.MainActivity主函数 package com.example.administrator.searchapplication; import android.support.v7.app.AppCompatActivity; import

  • Android Studio3.6.+ 插件搜索不到终极解决方案(图文详解)

    不知道什么时候Android Studio 插件和Gradle升级后,插件在线安装就搜索不到插件了,一直处于转圈圈状态,通过各种测试和摸索总结出几种解决方案.我的Android Studio已经升级到3.6.3. 一.排查他因 排除一些相关因素,这些方法排除后任然无法搜索插件再使用终极解决方案. 1. 网络检查 . 确定无法搜索到插件前,一定要确定网络状态良好,弱网状态下也是会半天搜索不出插件的.不然后面忙了大半天要哭了. 2. 取消代理 二.终极方案 如下列举的几种方法都可有效解决插件搜索不到

  • Android Studio实现搜索栏

    前言 一.何为自定义控件? 系统自带的控件都是直接或间接继承自View的,View是Android中最基本的UI组件库.当系统的自带控件无法满足需求时,依据控件的继承结构来制作自定义控件,例如:顶部搜索栏 二.制作步骤 1.引入布局 如果在每一个Activity的布局中都编写一个搜索栏,会导致代码的重复.通过采用引入布局的形式,可以解决这个问题. 首先在layout目录下创建一个select.xml布局,代码如下: <?xml version="1.0" encoding=&qu

  • Android基于RecyclerView实现高亮搜索列表

    话不多说先看今天的实现的效果: 相信这种效果很多项目都会用到,今天就讲讲利用RecycleView来实现他,博主把此篇文章定位初级篇,可能因为这确实很简单,所以我要更要讲的详细一点让新手也可以能看的懂. 饭要开始做了,我们要准备哪些食材呢. 1.一个RecyclerView或是listview或是其他可以显示多item的控件(主要的干货) 2.搞清楚EditText的实时监听 3.让一个textview出现不同的颜色 4.如何穿过Adpter找出textview中key值(也就是高亮字符串) 当

  • Android输入框实时模糊搜索效果的示例代码

    Android输入框实时模糊搜索 很多开发场景会用到搜索框实时模糊搜索来帮助用户输入内容,如图 思路是在EditText 字符变动的时候 弹出ListPopupwindow并更新列表,这样的做法google已经封装为AutoCompleteTextView 用法 mAutoCompleteTextView.setAdapter(adapter); mAutoCompleteTextView.setFocusable(true); mAutoCompleteTextView.setOnItemCl

  • Android搜索结果显示高亮实例(有数据滑动底部自动刷新)

    首先的效果图 搜索到结果(这里我只是模拟数据,真正和服务器走得时候,返回来的数据都应该包含关键字的) 模拟的没有搜索结果的界面 具体实现 在这插一句哈,就是做一件事情,拆分成多个小结,不至于在开发的时候摸不着头脑而且还能把控开发的进度. 思路其实很简单,我们监听输入框的变化,然后在文字变化之后去请求服务器,然后取到我们需要的结果,进行数据展示即可. 第一步:搜索框的监听 et_search.addTextChangedListener(new TextWatcher() { @Override

  • Android自定义流式布局实现淘宝搜索记录

    本文实例为大家分享了Android实现淘宝搜索记录的具体代码,供大家参考,具体内容如下 效果如下: 废话不多说 实现代码: attrs.xml <declare-styleable name="TagFlowLayout"> <!--最大选择数量--> <attr name="max_select" format="integer"/> <!--最大可显示行数--> <attr name=&q

  • android通过拼音搜索中文的功能实现代码

    好几年没写博客了,很多知识不记是真的会忘记,以后还是保持写博客的习惯吧.坚持不一定成功,但放弃一定很舒服!(开玩笑(#^.^#)) 回归正题,今天我要记录的是拼音搜索功能,我记得16年的时候做过这个功能.现在已经忘记很多细节了,所以这次好好写一写! 第一步:准备 第三方包--中文转拼音,pinyin4j-2.5.0.jar,官网http://pinyin4j.sourceforge.net/ Filterable.java 过滤接口 第二步:分析功能并实现 很明显,这是两个功能,一个是中文转拼音

  • Android实现搜索历史功能

    本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空 1. 判断搜索内容是否含表情,不需要可以不判断 /** * 校验字符串是否含有表情 * @param content * @return */ public static boolean hasEmoji(String content){ Pattern pattern = Pattern.compile("[\ud83c\udc

  • Android 搜索结果匹配关键字且高亮显示功能

    1. 单关键字 匹配 如果只是单关键字的话,那么我们先计算出他的下标,它的长度,然后就可以标记下标到下标+长度的这一段为特殊颜色即可,代码如下: if (name != null && name.contains(keyWord)) { int index = name.indexOf(keyWord); int len = keyWord.length(); Spanned temp = Html.fromHtml(name.substring(0, index) + "<

随机推荐