2013-07-02 106 views
5

我們正在調整我們的Intranet Web應用程序以符合WCAG 2.0標準。該應用程序提供了一個複雜的控件列表,但我無法讀取屏幕讀取列表中的任何內容,但labelDisplay或列表的labelFunction返回的是什麼。如何讓屏幕閱讀器讀出itemRenderer組件

下面是一個簡化的例子,screenOrder和listBox讀取「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」和「按鈕」,但是屏幕閱讀器不讀出來。

是否可以讀取每個標籤和按鈕?

回答

1

我有幾個建議,但我不知道他們是否會工作或不(我的屏幕閱讀器在清潔工)。

首先,您可能會從ListAccImpl類中找到interesting reading here類,這些類關於List類如何與屏幕閱讀器配合使用。特別是,在關於子對象(渲染器)的章節中注意以下句子:

...列表項的可訪問性由列表管理;項目渲染器的accessibilityImplementation和accessibilityProperties被Flash Player忽略。

這解釋了爲什麼屏幕閱讀器只讀出labelDisplay的值或返回labelFunction。即使你已經在渲染器中聚焦了一個對象,看起來List仍然處於對屏幕閱讀器的控制之中。這在docs for the AccImpl類(也來自子節)中得到進一步證實:

Flash Player不支持真正的可訪問對象層次結構。如果DisplayObject具有accessibilityImplementation對象,則忽略其子對象的accessibilityImplementation對象。

建議

  • 嘗試ListfocusEnabled屬性設置爲false。當您通過用戶界面選項卡時,渲染器中的對象仍然會聚焦,但List本身不會。由於AccImpl的文檔似乎暗示,因此List將不管理與屏幕閱讀器的交互,並且它將被推遲到呈現器中的可聚焦對象。

  • 嘗試擴展List類,並覆蓋它的initializeAccessibility()方法。此方法(我假設)由Flex組件生命週期調用,並且該列表獲得與屏幕閱讀器進行交互的能力。如果您沒有初始化可訪問性實現,我的想法是它會將這個責任推遲到渲染器中的對象。或者它可能會崩潰並燃燒。

這就是我得到的所有,希望它有幫助...好的問題,請分享你的發現。

+0

我遵循你的建議,他們工作得很好!我能夠在每個項目渲染器內部的控件中進行選擇! 謝謝! – Adz

+0

@Adz太棒了!爲了我的好奇心和他人的利益,你解決了哪個解決方案? –

+0

我應用了這兩個建議,它們在兩者之間都不正確。 – Adz

相關問題