我使用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,则返回。
抱歉我的英语不好。
答案 0 :(得分:0)
您的服务获得的每个AccessibilityNodeInfo
都将是一个唯一的对象(实际上,它们是合并的,因此您可以在recycle()
调用后再次看到相同的节点,但在此问题的范围内,它们是唯一的)。
在API 14+上,您可以使用equals()来检查两个节点在同一窗口中是否代表相同的视图。
在API 14之前,AccessibilityNodeInfo
不会覆盖equals()
或hashCode()
,因此您无法在表示相同视图的节点之间进行相等性比较。如果视图设置了唯一ID(例如View.getId()
),那么您最好的选择是比较AccessibilityNodeInfo.getViewIdResourceName()的结果。
除此之外,没有可靠的方法来比较API上的两个AccessibilityNodeInfo
对象&lt; 14.您可以考虑使用屏幕上的位置和其他可用属性等启发式方法,但不保证这些属性是唯一的。
答案 1 :(得分:0)
AccessibilityNodeInfo
同时拥有equals()
和hashCode()
。如果查看源代码,可以看到它们使用窗口和视图ID,因此如果两个辅助功能节点在同一窗口中表示相同的视图,则它们将是相同的。
如果在调用onAccessibilityEvent()
之间视图或布局发生变化,那么这些功能可能对您无效。但是如果布局和内容保持不变,那么您可以使用它们来比较可访问性节点。