Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android AccessibilityLegate强制读取视图组而不是子视图_Java_Android_Android Studio_Accessibility_Talkback - Fatal编程技术网

Java Android AccessibilityLegate强制读取视图组而不是子视图

Java Android AccessibilityLegate强制读取视图组而不是子视图,java,android,android-studio,accessibility,talkback,Java,Android,Android Studio,Accessibility,Talkback,我使用的是一个viewpager,它由一些相对布局的兄弟组成,非常复杂 如果我点击相对布局,它将突出显示整个页面,并按照预期一个接一个地阅读标题和一些文本视图 如果我滚动viewpager,我希望talkback以与单击第一页相同的方式阅读下一页。其次,如果我滚动到第二页、第三页等页面并单击这些布局,talkback将按预期阅读 我试图在滚动事件完成后实现单击行为 这是我为accessibilityDelegate准备的 viewPager.setAccessibilityDelegat

我使用的是一个viewpager,它由一些相对布局的兄弟组成,非常复杂

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

如果我滚动viewpager,我希望talkback以与单击第一页相同的方式阅读下一页。其次,如果我滚动到第二页、第三页等页面并单击这些布局,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”是我认为的相对年轻父母我还确认了onRequestSendAccessibilityEvent正在被触发,但它没有读取其子项的内容。我遗漏了什么吗

已更新

我也试过使用

viewpager.getCurrentPageView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
当我需要强制talkback重读一个项目时,上面的例子就起到了作用,但如果我在页面上尝试,则没有任何影响

感谢您提供了一些背景信息——当您点击相关版面时,TalkBack会根据版面内容生成语音。在ICS上,这是由悬停\回车事件触发的。在果冻豆上,它是由一个可访问性事件触发的。这些事件是由框架自动发送的,一般来说,决不能从应用程序手动发送。焦点事件也是如此,自定义视图的特殊情况除外(有关更多详细信息,请参阅)

那么,回到话题上来

您可以通过用要读取的文本填充传出事件来控制滚动事件的语音。不利的一面是,您需要手动生成您想要阅读的文本,并且如果用户触摸布局,该文本很可能与对讲机将阅读的文本不同

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易访问性的首选交互模型


编辑:视频URL已损坏、更改。

此问题已在google check上报告

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

但在(2016年3月)发布后,该问题已得到解决。


将Support Library更新为Android Support Library至23.2.1

我以前也遇到过同样的问题。现在我将
android:focusable=“true”
添加到视图组中,TalkBalk将读取视图组,而不是其子对象

这是否意味着我需要手动递归所有子对象并获取内容描述?我使用onInitializeAccessibilityNodeInfo、onInitializeAccessibilityEvent设置了可访问性委托,onPopulateAccessibilityEvent和onRequestSendAccessibilityEvent。唯一正在触发的是onRequestSendAccessibilityEvent。如果我在事件上设置了内容描述,它会第一次读取,但看起来该事件是重复使用的,它不会在第二次、第三次等时间读取事件上的内容描述集。找到解决方案了吗??面对同样的问题