android - 使用 AccessibilityService 中的 AccessibilityNodeInfo 执行滚动

标签 android accessibilityservice

我想滚动当前屏幕。 我试过这个 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/

相关文章:

Android:当 "focus"在特定 View 上时,如何在对讲(可访问性)期间中断?

java - 无法从嵌套 Firebase 数据库获取值

javascript - 我的 javascript 代码在 pc 上运行但不在 android 或 ios 上运行

android - 特殊字符的问题

java - 当用户关闭所需的应用程序时,辅助服务会删除图标

android - 在 Android 手机主屏幕上检测触摸或滑动

安卓 : Read Google chrome URL using accessibility service

android - 我可以作为应用开发者解决 Play 商店中的 -505 错误吗? (非 Adob​​e air 应用程序)

java - adobe flash builder 是否适合 android 应用程序开发?

android - 检测我的辅助功能服务是否已启用