2014-02-27 47 views
3

我使用的Viewpager由一些相對複雜的相對佈局兄弟組成。Android AccessibilityDelegate閱讀ViewGroup而不是兒童

如果我點擊相對佈局,它會突出顯示整個頁面,並按照預期逐個讀取標題和幾個文字瀏覽。

如果我滾動viewpager,我希望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'是RelativeLayout父母,我認爲它是。 我也確認onRequestSendAccessibilityEvent被解僱,但它沒有讀取其子女的內容。我錯過了什麼嗎?

更新

我使用

viewpager.getCurrentPageView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 

,當我需要強制對講重讀一個項目上面工作了另一個例子也試過,但沒有任何影響,如果我嘗試它在頁面上。

感謝

回答

2

一些背景 - 當您在相對佈局挖掘,話語提示生成基於佈局的內容發言。在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可訪問性的首選交互模式。

編輯:視頻網址已損壞,已更改。

+0

這是否意味着我需要手動遞歸通過所有子節點並獲取內容描述? –

+0

我使用onInitializeAccessibilityNodeInfo,onInitializeAccessibilityEvent,onPopulateAccessibilityEvent和onRequestSendAccessibilityEvent設置了可訪問性委託。唯一被觸發的是onRequestSendAccessibilityEvent。如果我在第一次讀取的事件上設置了內容描述,但它看起來像事件被重用,並且它不讀取第二,第三和第二次事件中設置的contentDescription。 –

0

報道對谷歌這個問題檢查

其中滾動時ViewPager不設置AccessibilityEvent參數正確 。

但是(2016年3月)的Android Support Library, revision 23.2.1 releas 此問題已得到解決之後。

更新支持庫,以Android Support Library to 23.2.1

0

我以前有同樣的問題。現在我將android:focusable="true"添加到ViewGroup中,TalkBalk將讀取ViewGroup而不是其子節點