3

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

如果我单击相对布局,它将突出显示整个页面并按预期一个接一个地阅读标题和一些文本视图。

如果我滚动 viewpager,我希望对讲器以与单击时读取第一页相同的方式读取下一页。其次,如果我滚动到第二、第三等页面并单击这些布局,对讲将按预期读取。

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

这是我对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);

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

谢谢

4

3 回答 3

4

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

那么,回到主题。

您可以通过使用要阅读的文本填充传出事件来控制滚动事件的语音。不利的一面是您需要手动生成要阅读的文本,并且如果用户触摸布局,该文本很可能与 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 */);
        }
    }
});

另一种选择是什么都不做,让用户自己探索视图。这是 Android 可访问性的首选交互模型。

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

于 2014-03-03T06:02:05.823 回答
0

google check 报告了这个问题

其中 ViewPager 在滚动时没有正确设置 AccessibilityEvent 参数。

但在Android 支持库发布后,修订版 23.2.1 (2016 年 3 月)此问题已得到解决。

将支持库更新为Android Support Library to 23.2.1

于 2016-03-15T06:37:27.690 回答
0

我以前也有同样的问题。现在我添加android:focusable="true"到 ViewGroup,TalkBalk 将读取 ViewGroup,而不是它的孩子

于 2017-03-16T11:45:41.377 回答