我想滚动当前屏幕。
我试过这个
AccessibilityNodeInfo accessibilityNodeInfo=getRootInActiveWindow();
accessibilityNodeInfo.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN);
但我总是说“无法在密封实例上执行此操作”。
请帮忙。
最佳答案
首先:您尝试做的事情存在问题。
当你看到这个
Cannot perform this action on a sealed instance.
此消息是 Android 告诉您您拥有的信息已设置。能够说出一个不可滚动的 View 对您来说有意义吗?不。您不能强制 View 可滚动。可滚动的 View 取决于 View 。例如,可滚动的 Button 是没有意义的!无障碍服务无法强制执行此行为。
应用程序的根节点很可能是某种类型的框架布局,并且永远无法滚动。层次结构的可滚动部分几乎总是主布局/ Root View 的 subview 。这个故事的寓意是,您不能说一个 View 是可滚动的,您必须找到一个可滚动的 View 。
话虽如此,我将为您提供一个更好的解决方案,希望它在您支持的设备范围内。
@TargetApi(Build.VERSION_CODES.M)
public boolean scrollTo(AccessibilityNodeInfo nodeInfo) {
return nodeInfo.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SHOW_ON_SCREEN.getId());
}
如果您需要支持 Android M 之前的版本,您需要做的是探索布局中 View 的 AccessibilityNodeInfo 层次结构,如果这是真的,这看起来大概像这样(未测试,但应该非常接近! ):
public boolean scrollView(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) return false;
if (nodeInfo.isScrollable()) {
return nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
}
for (int i = 0; i < nodeInfo.getChildCount(); i++) {
if (scrollView(nodeInfo.getChild(i)) {
return true;
}
}
return false;
}
关于android - 使用 AccessibilityService 中的 AccessibilityNodeInfo 执行滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44566402/