探究 Android 14 新功能之 TextView 搜索高亮和焦点移动~

news2024/11/24 12:42:08

前言

之前写的文章《Android 14 新功能之 HighLights》里,讲到 Android 14 里推出的 HighLights 新功能可以快速实现 TextView 文字的高亮效果,并支持动态更新

本文将继续介绍 TextView 的另 2 处新功能:

  1. 使用 searchResultHighlight 等针对 TextView 的搜索结果进行高亮展示
  2. 使用 focusedSearchResultIndex 针对 TextView 搜索焦点高亮和移动

搜索结果高亮

Android 14 推出了针对搜索结果展示高亮和当前焦点高亮的新 API:

  • setSearchResultHighlightColor(int color):设置所有匹配到搜索关键字的文本颜色,对应的还有 android:searchResultHighlightColor attribute 可以在 xml 中配置,当然也可以使用 getSearchResultHighlightColor() 在代码中获取当前颜色值
  • setSearchResultHighlights(int… ranges):设置所有匹配到搜索关键字的文字范围,同样提供了 getSearchResultHighlights() 支持在代码中获取匹配范围

下面我们利用这些 API 进行效果实战。

首先,我们先在代码里设置颜色,将搜索到的文字为水蓝色:

class TextViewActivity : AppCompatActivity() {
    companion object {
        const val TEXT_LONG = "val builder = Highlights.Builder()val val val val val val val val "
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        with(binding.textview2) {
            text = TEXT_LONG

            // set highlight color for searching
            searchResultHighlightColor = Color.CYAN
        }
}

接着,添加 button 模拟搜索:

class TextViewActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        // 模拟搜索按钮
        binding.startSearch.setOnClickListener {
            binding.textview2.run {
                Log.d("HighLights", "startSearch tapped" +
                        " and current search Color:${searchResultHighlightColor.toColorString()}"
                )

                // set searching ranges
                setSearchResultHighlights(4, 11, 25, 32)
            }
        }
}

运行下代码看下效果:点击 “Search” button 之后,builder 字样呈现出水蓝色高亮。

如下的 log 也显示当前设置的高亮色为水蓝色。

2023-05-21 14:01:47.632 5513-5513/com.ellison.demo D/HighLights: startSearch tapped and current search Color:CYAN

搜索焦点高亮和移动

搜索焦点移动新 API 如下:

  • setFocusedSearchResultHighlightColor(int color):设置当前聚焦到的匹配关键字的文本颜色,xml 中使用的 android:focusedSearchResultHighlightColor attribute 以及代码中获取该颜色值的 getFocusedSearchResultHighlightColor()

  • setFocusedSearchResultIndex(int index):设置当前聚焦到的匹配关键字的索引以及 getFocusedSearchResultIndex() 获取索引的方法

    注意默认的搜索焦点为 FOCUSED_SEARCH_RESULT_INDEX_NONE 即 -1,意味着搜索结果并未开始聚焦。

然后给 TextView 添加聚焦后颜色为灰色,并添加 button 模拟焦点移动:

class TextViewActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        with(binding.textview2) {
            ...
            // set matched searching highlight color
            focusedSearchResultHighlightColor = Color.GRAY
        }

        // 模拟焦点移动按钮
        binding.changeSearchIndex.setOnClickListener {
            binding.textview2.run {
                Log.d("HighLights", "changeSearchIndex tapped" +
                        " and current Focused Color:${focusedSearchResultHighlightColor.toColorString()}" +
                        " and currentFocusedResultIndex:${focusedSearchResultIndex}"
                )

                // Set index to first or second
                val newSearchIndex = when (focusedSearchResultIndex) {
                    TextView.FOCUSED_SEARCH_RESULT_INDEX_NONE, 1 -> 0
                    0 -> 1
                    else -> TextView.FOCUSED_SEARCH_RESULT_INDEX_NONE
                }

                Log.d("HighLights", "changeSearchIndex to :$newSearchIndex")
                binding.textview2.focusedSearchResultIndex = newSearchIndex
            }
        }
}

看下效果:点击 “Forward” button 之后灰色高亮在两个水蓝色高亮之间切换。

log 也显示当前设置的焦点高亮为灰色,焦点 index 随着点击在第一个和第二个之间切换。

2023-05-21 14:01:51.167 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex tapped and current Focused Color:GREY and currentFocusedResultIndex:-1
2023-05-21 14:01:51.167 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex to :0
2023-05-21 14:01:52.995 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex tapped and current Focused Color:GREY and currentFocusedResultIndex:0
2023-05-21 14:01:52.995 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex to :1
2023-05-21 14:01:54.363 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex tapped and current Focused Color:GREY and currentFocusedResultIndex:1
2023-05-21 14:01:54.363 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex to :0
2023-05-21 14:01:55.528 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex tapped and current Focused Color:GREY and currentFocusedResultIndex:0
2023-05-21 14:01:55.528 5513-5513/com.ellison.demo D/HighLights: changeSearchIndex to :1

总结

上个版本 13 时 Android 针对 TextView 提供了 LineBreakConfig 换行策略的新功能,到这次 14 一次性推出了文本高亮 HighLights、搜索高亮 searchResultHighlight 以及搜索焦点移动 focusedSearchResultIndex 3 个新功能。

虽然已经 Android 平台早已成熟、稳定,但 AOSP 团队仍不忘对 TextView 这个最基础的控件进行升级和优化。可以说 TextView 既是基础,同时也是使用最频繁、最重要的,所以官方的一点点改动都显得极为难得,开发者们需要知悉。

DEMO 源码

https://github.com/ellisonchan/AndroidUDemo

推荐阅读

  • Android 14 新功能之 HighLights:快速实现文本高亮
  • Android 13 新的换行策略和针对日文的优化

参考资料

  • https://developer.android.com/reference/android/widget/TextView#setSearchResultHighlightColor(int)
  • https://developer.android.com/reference/android/widget/TextView#setSearchResultHighlights(int[])
  • https://developer.android.com/reference/android/widget/TextView#setFocusedSearchResultHighlightColor(int)
  • https://developer.android.com/reference/android/widget/TextView#setFocusedSearchResultIndex(int)

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

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

相关文章

(转载)从0开始学matlab(第14天)—while循环结构

循环(loop) 是一种 matlab 结构,它允许我们多次执行一系列的语句。循环结构有两种基本形式 :while 循环和 for 循环。两者之间的最大不同在于代码的重复是如何控制的。在while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件…

Metabase可视化BI系统部署安装及简单使用

metabase 是国外开源的一个可视化系统,语言使用了Clojure TypeScript。 Clojure(/ˈkloʊʒər/)是Lisp程式語言在Java平台上的現代、動態及函數式方言。来自维基百科。 我也是第一次看到这个语言,知道它是可以运行在Java环境上的…

脱离文档流和半脱离文档流(详解)

脱离文档流和半脱离文档流(详解)_脱离文档流是什么意思_大前端工程师的博客-CSDN博客 脱离文档流 脱离文档流是指,该元素脱离了文档中。不再占据默认分配的空间,它下面的元素会上去补位。 可以理解为脱离文档流的元素离开了它的座…

1720_Linux学习中的问题处理

全部学习汇总:GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 这个有点学习的方法论的意思,画个滋味导图顺便整理一下。 遇到问题的时候,解决的方法大致有3中,而针对学习的建议有一部分是…

STL-queue和priority_queue的模拟实现

回顾 对于STL,我们已经知道了vector和list,而它们是STL中被称为六大组件之一的容器,我们还学习了模拟实现stack,而stack在STL中被称为六大组件之一的适配器,今天,我们来学习queue的模拟实现和priority_que…

分布式运用之ELK企业级日志分析系统

1.ELK的相关知识 1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch: 是基于Lucene&#xff0…

Tomcat服务器、Servlet生命周期、上传下载文件、使用XHR请求数据、注解使用

文章目录 Servlet认识Tomcat服务器使用Maven创建Web项目创建Servlet探究Servlet的生命周期解读和使用HttpServletWebServlet注解详解使用POST请求完成登陆上传和下载文件下载文件上传文件 使用XHR请求数据重定向与请求转发重定向请求转发 ServletContext对象初始化参数 Servlet…

基于自营配送模式的车辆路径规划设计与实现_kaic

摘要 近年来,随着我国消费水平逐渐提升,消费者在网上购物的频率也越来越高,电商发展速度迅猛,加大了物流配送的压力,促使物流企业以更大的运力,更短的时间将货物送达。在货品的运输过程中,成本居…

TCP 连接未必都是用TCP协议沟通

确实,一般来说 TCP 连接是标准的 TCP 三次握手完成的: 1.客户端发送 SYN; 2.服务端收到 SYN 后,回复 SYNACK; 3.客户端收到 SYNACK 后,回复 ACK。 SYN 会在两端各发送一次,表示“我准备好了&…

MicroBlaze系列教程(9):xilisf串行Flash驱动库的使用

文章目录 1. xilisf库简介2. xilisf库函数3. xilisf配置4. xilisf应用示例工程下载本文是Xilinx MicroBlaze系列教程的第9篇文章。 1. xilisf库简介 xilisf库(Xilinx In-system and Serial Flash Library) 是Xilinx 提供的一款串行Flash驱动库,支持常用的 Atmel 、Intel、S…

Linux基本指令介绍

目录 前言 指令操作与图形化界面的对比 adduser passwd whoami ls指令 pwd指令 cd指令 touch指令 mkdir指令 rmdir指令 && rm 指令 man指令 cp指令 mv指令 cat(显示文件内容(全部),且不可修改的)…

【1++的C++初阶】之模板

👍作者主页:进击的1 🤩 专栏链接:【1的C初阶】 文章目录 一,浅谈模板二,函数模板三,类模板 一,浅谈模板 在前面的文章【【1的C初阶】之C入门篇1】中我们对函数重载有了一定的认识&a…

Python-web开发学习笔记(3):Flask Demo,一个网站开发小案例

☕️ 推荐关注我的另一个专栏系列:大道至简,该系列收录了许多优质的人工智能算法博文,包括机器学习和自然语言处理等,持续更新中,欢迎各位关注~ 介绍完HTML标签,我们来搞一个简单的网站小案例,带…

一、CNNs网络架构-基础网络架构

目录 1.LeNet 2.AlexNet 2.1 激活函数:ReLU 2.2 随机失活:Droupout 2.3 数据扩充:Data augmentation 2.4 局部响应归一化:LRN 2.5 多GPU训练 2.6 论文 3.ZFNet 3.1 网络架构 3.2 反卷积 3.3 卷积可视化 3.4 ZFNet改…

6.4.6拓扑排序

用DAG&#xff08;有向无环图&#xff09;表示一个工程。顶点表示活动&#xff0c;有向边<Vi&#xff0c;Vj>表示活动Vi活动必须先与Vj活动进行。 所谓的拓扑排序&#xff1a;找到做事的先后顺序 以上根据拓扑排序的实现&#xff1a; 加入对有回路的图进行拓扑排序&#…

重磅,ChatGPT App 来了!(附保姆级教程)

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 日前&#xff0c;OpenAI宣布推出iOS移动版ChatGPT&#xff0c;为iPhone和iPad用户提供免费下载和使用机会。 总体而言&#xff0…

视频转换芯片MS7200概述 HDMI转数字RGB/YUV/HDMI RXReceive/替代IT66021FN

1. 基本介绍 MS7200 是一款 HDMI 接收芯片&#xff0c;兼容 HDMI1.4b 及 HDMI 1.4b 以下标准的视频 3D 传输格 式&#xff0c;最高分辨率可支持到 4K30Hz&#xff0c;最高采样率达到 300MHz。MS7200 支持 YUV 和 RGB 之 间的色彩空间转换&#xff0c;数字接口支持 YUV 及 RGB 格…

动态规划-完全平方数

动态规划-完全平方数 1 题目描述2 示例2.1 示例 1&#xff1a;2.2 示例 2&#xff1a;2.3 提示&#xff1a; 3 解题思路及方法3.1 解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 算法代码实现 跟着九章侯老师学习了动态规划专题之后根据学习…

联邦图神经网络:概述、技术和挑战

https://arxiv.org/pdf/2202.07256.pdf 摘要 图神经网络以其处理实际应用中广泛存在的图形数据的强大能力&#xff0c;受到了广泛的研究关注。然而&#xff0c;随着社会越来越关注数据隐私&#xff0c;GNN需要适应这种新常态。这导致了近年来联邦图神经网络&#xff08;FedGN…

一、阿里云oss

文章目录 一、阿里云oss1、开通“对象存储OSS”服务1.1创建Bucket1.2上传默认头像1.3获取用户acesskeys 2、使用SDK文档3、文件服务实现3.1搭建service-oss模块3.1.1 搭建service-oss模块3.1.2 修改配置3.1.3 启动类3.1.4配置网关 3.2 测试SDK3.3封装service接口3.4封装control…