0

我正在开发一个 android 应用程序并测试可访问性。在我们的 MainActivity 中,我们有一个左导航 DrawerView,并根据用户的左导航选择加载各种带有回收器视图的片段。

在测试可访问性/对讲时,我们注意到如果对讲集中在当前加载的片段回收器视图中的项目上,当左侧导航打开时,它通常会继续从背景片段中读取项目(意味着抽屉打开并且在前面片段)。

我们试图让辅助功能停止大声朗读背景,并在抽屉打开时读取抽屉布局的第一个视图。

我添加了一个调用来清除焦点 onDrawer open 像这样,认为一旦它重新获得焦点,它就会默认为抽屉中的第一个项目。根据需要,焦点确实落在我的抽屉视图中的第一个项目上,但它会一直播放背景项目,直到完成,然后最后读取它关注的左侧导航项目。

@Override
        public void onDrawerOpened(View drawerView) {
            //Clear Current Focus to allow Drawer items to take 
            drawerView.bringToFront();
            getCurrentFocus().clearFocus();
            super.onDrawerOpened(drawerView);

我在 onDrawerSlide 中尝试了相同的方法,并尝试像这样中断对讲:

 View focused = getCurrentFocus();
            if (focused != null) {

                ((AccessibilityManager) focused.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE)).interrupt();

该日志帮助我确保我永远不会获得当前焦点的空视图。

有人有任何提示或解决方案吗?

4

1 回答 1

0

我不明白当左侧导航打开时它是否获得焦点并且只有 TalkBack 继续落后或焦点保持在后面..

如果导航获得焦点并且它只是一个 TalkBack 问题,则将以下属性放在在导航处获得初始焦点的元素上 -

android:accessibilityLiveRegion="assertive"

这将使 TalkBack 停止之前的阅读会话并让新的焦点开始阅读。

现在,如果问题是你甚至没有获得焦点,因为它留在后面,添加这个 post 函数,调用焦点到你想要在导航打开后获得的特定视图。将它放在打开导航的 onClick 中,这样一旦打开它就会启动它 -

myCustomView.post(new Runnable() {
    @Override
    public void run() {
        myCustomView.requestFocus();
        myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    }
});

希望这对您有所帮助。

于 2018-05-02T14:44:43.650 回答