使用AccessibilityService中的AccessibilityNodeInfo执行滚动

时间:2017-06-15 11:31:14

标签: android accessibilityservice

我想滚动当前屏幕。 我试过这个 AccessibilityNodeInfo accessibilityNodeInfo=getRootInActiveWindow(); accessibilityNodeInfo.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN); 但我总是说“不能在密封的实例上执行此操作”。 求助。

1 个答案:

答案 0 :(得分:1)

第一:你正在尝试做的事情的问题。

当你看到这个

  

无法在密封的实例上执行此操作。

此消息是Android告诉您已设置的信息。你能告诉一个不可滚动的视图是否有意义?没有。您无法强制视图可滚动。可滚动的视图取决于视图。例如,一个可滚动的Button没有任何意义!辅助功能服务无法强制执行此操作。

应用程序的根节点很可能是某种类型的框架布局,并且永远不可滚动。层次结构的可滚动部分几乎总是主布局/根视图的子级。故事的道德,你不能告诉视图是可滚动的,你必须找到一个可滚动的视图。

话虽如此,我将为您提供更好的解决方案,希望它在您支持的设备范围内。

@TargetApi(Build.VERSION_CODES.M)
public boolean scrollTo(AccessibilityNodeInfo nodeInfo) {

    return nodeInfo.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SHOW_ON_SCREEN.getId());

}

如果你需要支持Android M的版本,你需要做的是探索布局中的视图的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;
}