如何让屏幕阅读器读取itemRenderer组件

5
我们正在将我们的企业内部网站应用程序改进为符合WCAG 2.0标准。该应用程序包含一系列复杂的控件,但我无法让屏幕阅读器读出列表中除labelDisplay或列表中每个项目labelFunction返回的内容以外的任何内容。
以下是一个简化的示例,"labelOne"被屏幕阅读器和列表框读取,而每个列表项的labelFunction的结果也被读取。
<?xml version="1.0"?>
<s:Application
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        xmlns:access="accessibility.*">
    <fx:Script><![CDATA[
        private function listLabelFunction(item : Object) : String {
            return item.one;
        }
        ]]></fx:Script>
    <s:VGroup>
        <access:Label id="labelOne" text="This text will be read out!"/>

        <s:List hasFocusableChildren="true" labelFunction="listLabelFunction">
            <s:itemRenderer>
                <fx:Component>
                    <s:ItemRenderer>
                        <fx:Script><![CDATA[
                            import mx.controls.Alert;
                            ]]></fx:Script>
                        <s:HGroup id="hGroup">
                            <access:Label id="labelDisplay" text="{data.one}"/>
                            <access:Label id="labelTwo" text="{data.two}"/>
                            <s:Button id="button" label="{data.button}" click="Alert.show('Ok!')"/>
                        </s:HGroup>
                    </s:ItemRenderer>
                </fx:Component>
            </s:itemRenderer>
            <s:dataProvider>
                <mx:ArrayCollection>
                    <fx:Object one="one" two="two" button="ok"/>
                    <fx:Object one="une" two="deux" button="ok"/>
                    <fx:Object one="uno" two="due" button="ok"/>
                    <fx:Object one="um" two="dois" button="ok"/>
                </mx:ArrayCollection>
            </s:dataProvider>
        </s:List>
    </s:VGroup>
</s:Application>

"访问标签";确保标签被读取并在选项卡顺序中。

package accessibility {
import mx.managers.IFocusManagerComponent;

import spark.components.Label;

public class Label extends spark.components.Label implements IFocusManagerComponent {
}
}

我可以通过“labelDisplay”、“labelTwo”和“button”在列表中切换,但屏幕阅读器无法读取它们。是否可能使每个标签和按钮都被读出来?
1个回答

1
我有一些建议,但我不知道它们是否有效(我的屏幕阅读器正在清洗中)。
首先,您可能会发现来自ListAccImpl类的有趣阅读关于List类如何与屏幕阅读器配合工作。特别是,请注意在子对象(渲染器)部分中的这个句子:

...列表项的可访问性由List管理;项目渲染器的accessibilityImplementation和accessibilityProperties被Flash Player忽略。

这解释了为什么屏幕阅读器只会读出labelDisplay的值或labelFunction的返回值。即使您已经将焦点放在渲染器中的对象上,似乎List仍然控制着屏幕阅读器。这在AccImpl文档类(也来自子元素部分)中得到进一步确认。
Flash Player不支持可访问对象的真正层次结构。如果DisplayObject具有accessibilityImplementation对象,则其子级的accessibilityImplementation对象将被忽略。
建议: - 尝试将List的focusEnabled属性设置为false。当您通过UI进行制表时,渲染器中的对象仍会获得焦点,但List本身不会。因此,对于AccImpl的文档似乎暗示,List因此不会管理与屏幕阅读器的交互,并且它将被推迟到渲染器中的可聚焦对象。 - 尝试扩展List类,并覆盖其initializeAccessibility()方法。我认为Flex组件生命周期调用此方法,并在其中列表获得与屏幕阅读器交互的能力。如果您不初始化辅助功能实现,则我的想法是它将把这个责任推迟到渲染器中的对象上。或者它可能会崩溃和燃烧。
这就是我所知道的,希望对您有所帮助...好问题,请分享您的发现。

我按照你的建议去做了,真的很管用!现在我能够通过制定的项渲染器来使用控件了。非常感谢! - Adz
@Adz 非常好!出于我的好奇心,也为了他人的利益,你最终选择了哪个解决方案? - Sunil D.
我尝试了两个建议,只用其中一个并不能使其正常工作。 - Adz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接