如何比较AccessibilityNodeInfo?

时间:2016-01-19 17:04:38

标签: android accessibility

我使用AccessibilityService编写了一个Android应用程序。这意味着:当文字出现" xxx" 时,它会自动点击它并自动关闭。但是当我滚动窗口或窗口中的某些内容时,它会点击并再次关闭。

所以我在Logcat中打印accessibilityNodeInfo.toString(),但同一accessibilityNodeInfo返回不同的字符串。我将展示代码以澄清我的意思:

AccessibilityNodeInfo previousAccessibilityNodeInfo = null;

mAccessibilityNodeInfo = event.getSource();

if (mAccessibilityNodeInfo == null) {
        return;
    }

if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
    List<AccessibilityNodeInfo> accessibilityNodeInfos
            = mAccessibilityNodeInfo.findAccessibilityNodeInfosByText("xxx");
        if (accessibilityNodeInfos != null && accessibilityNodeInfos.size() > 0) {
            AccessibilityNodeInfo info = accessibilityNodeInfos.get(accessibilityNodeInfos.size() - 1);
            Log.d(TAG,info.toString());
            if (previousAccessibilityNodeInfo == null) {
                previousAccessibilityNodeInfo = info;
                info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
            else if (previousAccessibilityNodeInfo != null && previousAccessibilityNodeInfo != info) {
                info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
            else {
                return;
            }

        }

    }

//日志信息:滚动时相同的AccessibilityNodeInfo返回不同的字符串。

accessibility.AccessibilityNodeInfo@36eea0;
accessibility.AccessibilityNodeInfo@38443e;
accessibility.AccessibilityNodeInfo@3999dc;
accessibility.AccessibilityNodeInfo@3aef7a;
accessibility.AccessibilityNodeInfo@3c4518;

//在上面的代码中是相同的AccessibilityNodeinfo

那么我应该如何比较AccessibilityNodeInfo?实现这样的结果,如果它是以前标记的AccessibilityNodeInfo,则返回。

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:0)

您的服务获得的每个AccessibilityNodeInfo都将是一个唯一的对象(实际上,它们是合并的,因此您可以在recycle()调用后再次看到相同的节点,但在此问题的范围内,它们是唯一的)。

在API 14+上,您可以使用equals()来检查两个节点在同一窗口中是否代表相同的视图。

在API 14之前,AccessibilityNodeInfo不会覆盖equals()hashCode(),因此您无法在表示相同视图的节点之间进行相等性比较。如果视图设置了唯一ID(例如View.getId()),那么您最好的选择是比较AccessibilityNodeInfo.getViewIdResourceName()的结果。

除此之外,没有可靠的方法来比较API上的两个AccessibilityNodeInfo对象&lt; 14.您可以考虑使用屏幕上的位置和其他可用属性等启发式方法,但不保证这些属性是唯一的。

答案 1 :(得分:0)

自API 14(冰淇淋三明治)以来,

AccessibilityNodeInfo同时拥有equals()hashCode()。如果查看源代码,可以看到它们使用窗口和视图ID,因此如果两个辅助功能节点在同一窗口中表示相同的视图,则它们将是相同的。

如果在调用onAccessibilityEvent()之间视图或布局发生变化,那么这些功能可能对您无效。但是如果布局和内容保持不变,那么您可以使用它们来比较可访问性节点。