Как активировать Talkback внутри просмотров фрагмента?

В настоящее время я добавляю специальные возможности в качестве новой функции в свое приложение. Моя цель состоит в том, чтобы пользователь мог перемещаться по нему с помощью интегрированной службы TalkBack под Android.

Все работает хорошо, так как я устанавливаю описание содержимого для элементов, которые находятся внутри моего макета активности, т. Е.

        <View
          style="@style/custom.style"
          android:contentDescription="@string/my_string_value"/>

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

У меня не было такого же успеха, используя только одно действие, которое накладывает на него несколько фрагментов. Поэтому, если я попытаюсь установить описание содержимого для любого элемента внутри макета фрагмента, оно не будет прочитано (автоматически), пока не будет обнаружено событие касания (я ожидаю, что TalkBack сделает это автоматически, точно так же, как представления в макете активности)

Чтобы получить результат, который я ожидаю, я это внутри класса фрагмента:

public abstract class myFragment extends Fragment  {
...
  @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {
       ...
       myCustomView = (LinearLayout) rootView.findViewById(R.id.duende);
       myCustomView.requestFocus();
  }
}

Пока это не увенчалось успехом, то же самое, что и настройка доступности при изменении содержимого.

getWindow().getDecorView().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);

Кто-нибудь сталкивался с подобной проблемой?


person Mauricio Sartori    schedule 16.09.2015    source источник


Ответы (2)


Не уверен, что вы все еще ищете решение, но для будущих ищущих :) -

Часто запрос фокуса срабатывает только один раз, вызываемый из функции post / postdelay.

Пример -

myCustomView.postDelayed(new Runnable() {
            @Override
            public void run() {
                myCustomView.setFocusable(true);
                myCustomView.requestFocus();
                myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
            }
        },1000);

При работе с фрагментами мне нравится вызывать как фокусы, так и фокус ввода, как это было сделано парнем в предыдущем ответе, и фокус доступности, потому что при реализации доступности для фрагментов вы можете решить некоторые раздражающие проблемы. следовательно, это всегда работает за меня.

person Itay Feldman    schedule 25.04.2018

Во-первых, важно отметить, что функции фрагментов ничем не отличаются от макетов при обычных действиях. Фрагменты - это всего лишь удобный способ структурирования кода. Что видят API-интерфейсы Android / Accessibility, если вы кодируете свое приложение как серию фрагментов или набор макетов в рамках одного действия, идентичны. При этом я считаю, что вы ищете следующее:

Что вам нужно сделать, так это сместить фокус доступности.

myCustomView.requestFocus();

перемещает то, что я считаю фокусом ввода. Это не повлияет на TalkBack, и на самом деле это почти полностью бессмысленно, если вы не используете навигацию с клавиатуры или мы говорим о поле EditText. Что вы хотите сделать, так это переместить фокус специальных возможностей / TalkBack. Это можно сделать с помощью следующей строки кода:

myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

ПРИМЕЧАНИЕ. Помните о критериях WCag 2.0, особенно когда речь идет об автоматическом переключении внимания на пользователей TalkBack. Это может сбить с толку незрячих пользователей!

person ChrisCM    schedule 17.09.2015