接上篇:安卓无障碍API封装库: Android-Accessibility-Api
本次2.0更新带来了:
搜索 AccessibilityNodeInfo.isChecked
为 true 的
//SF 为 SmartFinder缩写
SF.where { node ->
node.isChecked
}.find()
搜索 id 为 text1 或者 text 为 “123” 的 Node
SF.id("text1").or().text("123").find()
(text=="111" && desc=="111") || (text=="222" && desc=="222")
SF.where(SF.text("111").desc("111"))
.or(SF.text("222").desc("222"))
.find()
提供了中缀表达式,支持属性 _text
, _desc
, _id
SF.and(_text contains "Smart").clickable().findFirst()
SF.where(_id eq "view_id").findFirst()
//等效
SF.id("view_id").findFirst()
//使用中缀表达式
(SF where text("1111") or text("2222")
and id("111") or longClickable()).findAll()
支持协程主要是为了在等待搜索时,能够及时响应 Job.cancel()
//主动附加协程上下文,可在搜索时感知取消事件
SF.attachCoroutine()
.id("view_id")
.waitFor(10_000)
封装自定义搜索条件,使调用起来更简洁
库中搜索条件全部实现位于SmartFinderConditions.kt
例如 定义使用正则匹配Node文本
class TextMatcherCondition(private val regex: String) : MatchCondition {
//此处注意直接创建Regex,防止在搜索时重复创建;另外可直接检查正则表达式有效性
private val reg = regex.toRegex()
override fun invoke(node: AcsNode) =
node.text?.toString()?.let {
reg.matches(it)
} ?: false
}
此时,已经可以这样使用:
SF.where(TextMatcherCondition("[0-9]+")).find()
追究简洁,可进行扩展方法:
fun ConditionGroup.matchText(reg: String) = link(TextMatcherCondition(reg))
之后可简化调用
SF.matchText("[0-9]+").find()