java - Android AccessibilityDelegate 强制读取 ViewGroup 而不是 child

标签 java android android-studio accessibility talkback

我正在使用一个 viewpager,它由一些相当复杂的相对布局兄弟组成。

如果我点击相关布局,它将突出显示整个页面并按预期依次阅读标题和几个 TextView 。

如果我滚动 viewpager,我希望 talkback 阅读下一页,就像我单击它时读取第一页的方式一样。其次,如果我滚动到第二、第三等页面并单击这些布局,对讲将按预期读取。

我试图在滚动事件完成后实现点击行为。

这是我对 accessibilityDelegate 的看法。

    viewPager.setAccessibilityDelegate(new AccessibilityDelegate () {
        @Override
        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
            if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
                View page = viewPager.getCurrentPageView();
                performAccessibilityAction(page, AccessibilityNodeInfo.ACTION_CLICK, Bundle.EMPTY);
            }
            return super.onRequestSendAccessibilityEvent(host, child, event);
        }
    });

我已经验证“page”是我认为的 RelativeLayout 父级。 我还确认正在触发 onRequestSendAccessibilityEvent,但它不会读取其子项的内容。我是否遗漏了什么?

已更新

我也试过用

viewpager.getCurrentPageView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

当我需要强制对讲重读单个项目时,上面的代码适用于另一个示例,但如果我在页面上尝试它没有任何影响。

谢谢

最佳答案

一些背景——当您点击相关布局时,TalkBack 会根据布局的内容生成语音。在 ICS 上,这是由 HOVER_ENTER 事件触发的。在 Jelly Bean 上,它由 ACCESSIBILITY_FOCUS 事件触发。这些事件由框架自动发送,一般来说,不应从应用程序手动发送。 FOCUS 事件也是如此,自定义 View 的特殊情况除外(有关详细信息,请参阅 Accessibility talk from Google I/O 2013)。

那么,回到主题。

您可以通过使用要阅读的文本填充传出事件来控制 SCROLLED 事件的语音。不利的一面是,您需要手动生成要阅读的文本,而且如果用户触摸布局,该文本很可能与 TalkBack 将阅读的内容不同。

viewPager.setAccessibilityDelegate(new AccessibilityDelegate () {
    @Override
    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(host, event);

        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
            event.setContentDescription(/** your text */);
        }
    }
});

另一种选择是什么也不做,让用户自己探索 View 。这是 Android 辅助功能的首选交互模型。

编辑视频网址已损坏,已更改。

关于java - Android AccessibilityDelegate 强制读取 ViewGroup 而不是 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078383/

相关文章:

java - 指定可执行 jar 中子目录的文件路径

java - 如何在使用 Selenium WebDriver 触发的每个事件上自动测试谷歌分析

java - 在mysql数据库中插入日期

java - 无法解析符号 'Spinner'

java - 需要 Spring Boot CLIENT_PLUGIN_AUTH

java - 如何从 OpenStreetMap 离线创建 map 图 block ,在 Android 上显示?

android - 将 Assets 文件夹中的本地 css/js 文件添加到远程网页

android - 如何根据日期和时间对我的 RecyclerView 进行排序

android - Gradle 同步失败 : Could not find com. android.tools.build :gradle-experimental:3. 3.2

android - Android 4 上 Android Studio 的 NoClassDefFoundError