2015-02-12 90 views
2

我正在努力創造PagerTabStrip以及更多TalkBack發聲。 的背景是:PagerTTStriptrip話語提示輔助功能

  • 我要添加「選項卡[標籤名稱]未選中,單擊兩次選擇」在左側和右側的標籤和「選項卡[標籤名]中選擇」到中心之一TalkBack用戶。
  • 我還希望在點擊標籤時添加發聲,以警告用戶更改其內容並告訴TalkBack將焦點置於中心標籤。

我已經通過重寫所有所需的類得手部分做(例如:PagerTitleStripViewPagerFragmentPagerAdapter),並直接在標籤上TextView添加合適的contentDescription。它工作得很好,但我不滿意。這些類的維護需要針對Android主類的每個新版本進行更新(或者我會保留舊的設計),並且我發現每次都會複製粘貼所有類的內容(以及下一個開發者呢?)。 所以,我嘗試另一個approches:

  • PagerTabStrip子類使用AccessibilityEvent給予更多的上下文發聲。它不起作用,因爲getText()getContentDescription方法在AccessibilityEvent不用於發聲。
  • ViewPager開始工作AccessibilityNodeInfo,看我能否解決問題。但我沒有確定發聲的來源(是標籤還是內容),也沒有在AccessiblityNodeInfo中改變發聲的必須改變。

所以,我不知道是否有可能或不使用子類來解決我的問題,或者如果我沒有選擇,只能複製主要的類。 在此先感謝您的幫助。

回答

0

這其實很簡單。你想要做的是創建一個PagerTabStrip的子類。在這個小類中,增加可訪問性事件的傳播以添加您希望的信息!以下是我的實施。

public class A11yPagerTabStrip extends PagerTabStrip { 

    public A11yPagerTabStrip(Context context) { 
     super(context); 
    } 

    public A11yPagerTabStrip(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 


    @Override 
    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { 
     Log.wtf(LOG_TAG, "onRequestSendAccessibilityEvent: " + event.toString()); 

     final String textViewTitle = ((TextView) child).getText().toString(); 
     final ViewPager viewPager = (ViewPager) this.getParent(); 
     final int itemIndex = viewPager.getCurrentItem(); 

     String title = viewPager.getAdapter().getPageTitle(itemIndex).toString(); 

     if (textViewTitle.equalsIgnoreCase(title)) { 
      child.setContentDescription("Tab " + textViewTitle + "selected."); 
     } else { 
      child.setContentDescription("Tab " + textViewTitle + "not selected."); 
     } 

     return super.onRequestSendAccessibilityEvent(child, event); 
    } 

} 

請注意,我覆蓋了內容描述。通過這種方式,我們不會更改應用程序的任何可視化表示形式,而只是返回的內容。

注:對講用戶用於「雙擊選擇」部分。我會放棄這一點,就像我在代碼中所做的那樣。

+0

Thansk很多,它的工作!我用我的OnPageChangeListener來選擇當前的Talkback選項卡,而不是最後一個被點擊的選項卡。我知道Android TalkBack用戶習慣於沒有指示什麼是可點擊的行爲,我想我會等待用戶測試;-) – user1980386 2015-02-13 15:46:47

0

對於標籤本身,如果你是負責充氣視圖,則可以使用該修改是根據它的激活(或選定的)狀態下的內容描述的自定義的TextView:

public class TabTextView extends TextView { 

    public TabTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public CharSequence getContentDescription() { 
     CharSequence contentDescription = super.getContentDescription(); 
     return isActivated() ? appendSelectedTo(contentDescription) : contentDescription; 
    } 

    private String appendSelectedTo(CharSequence contentDescription) { 
     return getResources().getString(R.string.tab_selected, contentDescription); 
    } 
} 

其中R.string.tab_selected<string name="tab_selected">%1$s selected</string>

該預假設你(或the library you're using)被選擇時(和所有其它選項卡與setActivated(false)/setSelected(false))的標記用setActivated(true)/setSelected(true)的標籤圖。


宣佈該內容已經改變了用戶最簡單的方法是添加ViewPager.OnPageChangeListener宣告當頁面的變化:

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     // TODO: format correctly with String resource to support translation 
     viewPager.announceForAccessibility("Showing " + viewPager.getAdapter().getPageTitle(position)); 
    } 

}); 

我知道Android的話語提示用戶用於沒有跡象表明什麼是可點擊的行爲

(默認情況下)在@ChrisCM提到的可點擊元素上有一個提示 - TalkBack會在附帶的View.OnClickListener上追加「雙擊啓動」(以前稱爲「雙擊選擇」)視圖。

可以修改話語提示通過重寫onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info)方法有無障礙代表朗讀動作:

class TabAccessibilityDelegate extends AccessibilityDelegateCompat { 

    @Override 
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { 
     super.onInitializeAccessibilityNodeInfo(host, info); 
     info.addAction(
       new AccessibilityNodeInfoCompat.AccessibilityActionCompat(
         AccessibilityNodeInfoCompat.ACTION_CLICK, 
         "select tab" 
       ) 
     ); 
    } 

} 

,並設置它在每個標籤瀏覽的:

ViewCompat.setAccessibilityDelegate(tabView, new TabAccessibilityDelegate()); 

這樣,現在話語提示將顯示爲:"<tab content description>... double tap to select tab"

其他定製使用提示的方法在this answer中給出。