Android AccessibilityDelegate强制读取ViewGroup而不是子级

时间:2014-02-27 19:24:34

标签: java android android-studio accessibility talkback

我正在使用一个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);

上面的另一个例子是我需要强制对讲重新读取单个项目但如果我在页面上尝试它没有任何影响。

由于

3 个答案:

答案 0 :(得分:2)

一些背景 - 当您点击相对布局时,TalkBack会根据布局的内容生成语音。在ICS上,这是由HOVER_ENTER事件触发的。在Jelly Bean上,它由ACCESSIBILITY_FOCUS事件触发。这些事件由框架自动发送,一般来说,永远不应从应用程序手动发送。除了自定义视图的特殊情况外,FOCUS事件也是如此(有关详细信息,请参阅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 */);
        }
    }
});

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

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

答案 1 :(得分:0)

谷歌检查报告了此问题

  

其中ViewPager未正确设置AccessibilityEvent参数   滚动时。

但在Android Support Library, revision 23.2.1(2016年3月)发布后此问题已得到解决。

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

答案 2 :(得分:0)

之前我遇到过同样的问题。现在我将android:focusable="true"添加到ViewGroup,TalkBalk将读取ViewGroup而不是其子节点