2015-02-12 9 views
2

Я в настоящее время изо всех сил пытаюсь создать PagerTabStrip с более TalkBack вокализации. Контекст:PagerTabStrip TalkBack accessibility

  • Я хочу, чтобы добавить «Tab [имя вкладки] не выбран, нажмите дважды, чтобы выбрать» на левой и правой вкладки и «Tab [Закладка имя] выбрано» к центру один для TalkBack пользователя ,
  • Я также хочу добавить вокализацию при нажатии на вкладку, чтобы предупредить пользователя об изменении его содержимого и сообщить TalkBack, чтобы сфокусировать вкладку центра.

я уже удался частично сделать это путем переписывания всех необходимых классов (например: PagerTitleStrip, ViewPager, FragmentPagerAdapter) и добавив нужное contentDescription непосредственно на вкладке TextView. Он работает довольно хорошо, но я не удовлетворен. Техническое обслуживание этих классов необходимо обновить для каждой новой версии основных классов Android (или я сохраню старый дизайн), и я нахожу грязным, чтобы копировать все содержимое класса каждый раз (и как насчет следующих разработчиков?). Итак, я попробовал еще approches:

  • Использование AccessibilityEvent в подклассе PagerTabStrip дать больше контекста для вокализации. Это не сработало, потому что getText() и getContentDescription методов в AccessibilityEvent не используются для вокализации.
  • Работайте над AccessibilityNodeInfo от ViewPager, чтобы узнать, смогу ли я это обработать. Но я не определяю источник вокализации (это вкладки или контент), а также то, что должно быть изменено в 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); 
    } 

} 

Обратите внимание, что я переопределяю описание содержимого. Таким образом, мы не меняем визуального представления приложения, а только то, что говорит разговор.

ПРИМЕЧАНИЕ. Пользователи Talkback используют часть «двойного касания, чтобы выбрать». Я оставил бы это, как я сделал в своем коде.

+0

Thansk много, это сработало! Я использовал свой OnPageChangeListener, чтобы выбрать текущую вкладку с Talkback, а не последнюю, которая была нажата. Я знаю, что пользователи Android TalkBack привыкли к поведению без указания того, что можно щелкнуть, я думаю, я буду ждать пользовательских тестов ;-) – user1980386

0

Для самой вкладки, если вы несете ответственность за раздувания View, то вы можете использовать собственный 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(true)/setSelected(true) при выборе (и все остальные вкладки с setActivated(false)/setSelected(false)).


Самый простой способ сообщить пользователю о том, что содержание изменилось, чтобы добавить 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 пользователи TalkBack являются используемый для поведения без указания на то, что можно щелкнуть

Существует (по умолчанию) указание на элементы, которые можно щелкнуть, как указано в @ChrisCM - TalkBack добавит «Double Tap to Activate» (ранее «Double Tap to Select») на Views с прикрепленным 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()); 

таким образом, что в настоящее время TalkBack будет читать: "<tab content description>... double tap to select tab".

Другие способы настройки подсказки использования приведены в this answer.

Смежные вопросы