2014-02-26 14 views
4

我們正在尋找發送無法鏈接到視圖的可訪問性事件(將由TalkBack等提取)。發送與視圖無關的可訪問性事件

例如,如何在AsyncTask完成時發送輔助功能事件(例如對話說「數據已下載」)?

+0

也許應重新考慮這是否是最好的地方 - 您只會向TalkBack的用戶提供反饋,但不會在視覺上提供反饋?這使非TalkBack用戶無法訪問。 – ataulm

回答

-1

嘗試使用廣播消息,您可以向廣播接收器發送意圖,然後在接收器中啓動通知或其他內容。

5

看起來,如果AccessibilityEvent.getSource()返回null,TalkBack的當前版本將忽略通知,因此您最好使用Toast。這對於向用戶提供一致的反饋,無論他們是否使用「話語提示」都具有額外的好處。

Toast.makeText(context, /** some text */, Toast.LENGTH_SHORT).show(); 

但是通常,你可以手動創建一個AccessibilityEvent並通過AccessibilityManager發送。

AccessibilityManager manager = (AccessibilityManager) context 
     .getSystemService(Context.ACCESSIBILITY_SERVICE); 
if (manager.isEnabled()) { 
    AccessibilityEvent e = AccessibilityEvent.obtain(); 
    e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT); 
    e.setClassName(getClass().getName()); 
    e.setPackageName(context.getPackageName()); 
    e.getText().add("some text"); 
    manager.sendAccessibilityEvent(e); 
} 
+0

嘗試此操作時沒有任何運氣,Talkback沒有說出文字。有任何想法嗎? –

+0

對不起,setAction()調用應該是setEventType()。 – alanv

+0

此外,它看起來像最新版本的話語提示將拒絕沒有來源的事件。這看起來像一個錯誤。同時,你可能只想顯示一個吐司。 – alanv

1

您可以像@alanv所說的那樣直接使用可訪問性管理器(因爲API 14)。 但是由於API 16,您必須提供一個視圖。

final View parentView = view.getParent(); 
if (parentView != null) { 
    final AccessibilityManager a11yManager = 
      (AccessibilityManager) view.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); 

    if (a11yManager != null && a11yManager.isEnabled()) { 
     final AccessibilityEvent e = AccessibilityEvent.obtain(); 
     view.onInitializeAccessibilityEvent(e); 
     e.getText().add("some text"); 
     parentView.requestSendAccessibilityEvent(view, e); 
    } 
} 
相關問題