Krosxx / Android-Auto-Api

安卓无障碍服务Api, 为了简化无障碍服务使用,并使用 Kotlin 以提供简洁的Api。
Apache License 2.0
494 stars 83 forks source link

相同节点获取问题 #34

Closed 0cococ closed 1 year ago

0cococ commented 1 year ago
/**
 * 深搜遍历
 *
 * @param node AccessibilityNodeInfo?
 * @param all Boolean true 搜索全部返回list else return first
 * @param includeInvisible Boolean 是否包含不可见元素
 * @return ViewNode?
 */
private suspend fun traverseAllNode(
    node: ViewNode?, list: MutableList<ViewNode>? = null,
    includeInvisible: Boolean = false, depth: Int = 0,
    nodeSet: MutableSet<AcsNode> = mutableSetOf()
): ViewNode? {
    ensureActive()
    node ?: return null
    if (node.node in nodeSet) return null
    nodeSet.add(node.node)
    node.children.forEach { childNode ->
        ensureActive()
        if (childNode == null) {
            return@forEach
        }
        if (!includeInvisible && !childNode.isVisibleToUser) {
            return@forEach
        }
        if (findCondition(childNode.node)) {
            if (list != null) {
                list.add(childNode)
            } else return childNode
        }
        val r = traverseAllNode(childNode, list, includeInvisible, depth + 1)
        if (list == null && r != null) {
            return r
        }
    }
    return null
}如果连续两次使用相同的 ID 调用 traverseAllNode() 方法,由于 nodeSet 会记录已访问的节点,因此会检查节点是否已经存在于 nodeSet 中。如果已经存在,则直接返回上次找到的节点信息,并且不会重新获取这样如果我有俩不同的界面存在一样的id他会返回第一次获取的信息
Krosxx commented 1 year ago

不会使用id判等的,查看 AcsNode.equals具体实现

0cococ commented 1 year ago

啥意思我该怎么解决 我传入相同的id返回的是第一个的节点信息

Krosxx commented 1 year ago

用的 findFirst 还是findAll? 贴下代码

0cococ commented 1 year ago

image

0cococ commented 1 year ago

换界面也是上一个界面的信息 反正就是一直是第一界面的

0cococ commented 1 year ago

用的 findFirst 还是findAll?

贴下代码

能修复吗

Krosxx commented 1 year ago

用findAll

0cococ commented 1 year ago

用查找全部查找的他不返回具体的字符串啊 image image

0cococ commented 1 year ago

image 我刚刚测试了 还是只获取第一次出现的信息后面不同的界面相同的他还是给我返回第一次出现的