Choć wiele aplikacji na Androida TV bazuje na natywnych komponentach Androida, trzeba też wziąć pod uwagę ułatwienia dostępu stronom trzecim, platform i komponentów, zwłaszcza podczas korzystania z widoków niestandardowych.
Komponenty widoku niestandardowego łączące się bezpośrednio z OpenGL lub Canvas mogą nie działać prawidłowo z ułatwieniami dostępu takimi jak TalkBack czy Switch Access.
Weź pod uwagę niektóre z poniższych problemów, które mogą wystąpić po przełączeniu TalkBack dnia:
- Wyróżnienie ułatwień dostępu (zielony prostokąt) może zniknąć z aplikacji.
- Ułatwienia dostępu mogą zaznaczać granicę całego ekranu.
- Przenoszenie fokusu może nie być możliwe.
- Cztery klawisze kierunkowe na padzie kierunkowym mogą nie działać, nawet jeśli jest on obsługiwany przez Twój kod.
Jeśli zauważysz którykolwiek z tych problemów w aplikacji, sprawdź, czy
aplikacja ujawnia AccessibilityNodeInfo
w usłudze ułatwień dostępu.
W pozostałej części tego przewodnika znajdziesz wybrane rozwiązania i sprawdzone metody rozwiązywania tych problemów.
Usługi ułatwień dostępu odsłuchują zdarzenia za pomocą pada kierunkowego
Główna przyczyna tego problemu: kluczowe zdarzenia są wykorzystywane przez ułatwienia dostępu usług Google.
Jak pokazano na ilustracji 1, po włączeniu TalkBack zdarzenia na padzie kierunkowym nie są przekazywane do modułu obsługi pada kierunkowego zdefiniowanego przez programistę. Zamiast tego: usługi ułatwień dostępu odbierają kluczowe zdarzenia, aby można było przenieść ułatwienia dostępu. Niestandardowe komponenty Androida nie są domyślnie ujawniane informacje dla usług ułatwień dostępu o ich pozycji na ekranie, usługi ułatwień dostępu nie mogą przenieść fokusu, aby je wyróżnić.
Podobny wpływ ma to na inne usługi ułatwień dostępu – mogą być też zdarzenia na padzie kierunkowym używane podczas korzystania z funkcji Switch Access.
Ponieważ zdarzenia za pomocą pada kierunkowego są przesyłane do usług ułatwień dostępu.
nie wie, gdzie znajdują się komponenty interfejsu w widoku niestandardowym,
musisz zaimplementować w aplikacji AccessibilityNodeInfo
, aby przekazywać
kluczowe zdarzenia.
Udostępnianie informacji usługom ułatwień dostępu
Aby dostarczyć usługom ułatwień dostępu wystarczające informacje na temat
lokalizacja i opis widoków niestandardowych, implementacja AccessibilityNodeInfo
aby pokazać szczegóły każdego komponentu.
Zdefiniowanie logicznej relacji między widokami, tak aby usługi ułatwień dostępu
zarządzaj skupieniem, wdróż ExploreByTouchHelper
i ustaw go za pomocą
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
dla widoków niestandardowych.
Gdy implementujesz funkcję ExploreByTouchHelper
, zastąp jej 4 abstrakcyjne metody:
Kotlin
// Return the virtual view ID whose view is covered by the input point (x, y). protected fun getVirtualViewAt(x: Float, y: Float): Int // Fill the virtual view ID list into the input parameter virtualViewIds. protected fun getVisibleVirtualViews(virtualViewIds: List<Int>) // For the view whose virtualViewId is the input virtualViewId, populate the // accessibility node information into the AccessibilityNodeInfoCompat parameter. protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat) // Set the accessibility handling when perform action. protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean
Java
// Return the virtual view ID whose view is covered by the input point (x, y). protected int getVirtualViewAt(float x, float y) // Fill the virtual view ID list into the input parameter virtualViewIds. protected void getVisibleVirtualViews(List<Integer> virtualViewIds) // For the view whose virtualViewId is the input virtualViewId, populate the // accessibility node information into the AccessibilityNodeInfoCompat parameter. protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node) // Set the accessibility handling when perform action. protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)
Więcej informacji znajdziesz na konferencji Google I/O 2013 – Wspieranie osób niewidomych i niedowidzących Ułatwienia dostępu na Androidzie lub przeczytaj o wypełnianiu zdarzeń ułatwień dostępu.
Sprawdzone metody
Wymagane:
AccessibilityNodeInfo.getBoundsInScreen()
musi określać pozycję komponentu.Wymagane:
AccessibilityNodeInfo.setVisibleToUser()
musi odzwierciedlać widoczność komponentu.Wymagane:
AccessibilityNodeInfo.getContentDescription()
musi określać opis treści, aby usługa TalkBack mogła ogłosić żądanie.Podaj
AccessibilityNodeInfo.setClassName()
aby usługi odróżniały typ komponentu.Gdy zaimplementujesz
performAction()
, odzwierciedlają działanie za pomocą odpowiedniegoAccessibilityEvent
.Aby wdrożyć więcej typów działań, takich jak
ACTION_CLICK
, wywołajAccessibilityNodeInfo.addAction(ACTION_CLICK)
. za pomocą odpowiedniej funkcji logicznej w funkcjiperformAction()
.W razie potrzeby uwzględnij stan komponentu
setFocusable()
.setClickable()
,setScrollable()
i podobnymi metodami.Zapoznaj się z dokumentacją dotyczącą
AccessibilityNodeInfo
aby określić inne sposoby, w jakie usługi ułatwień dostępu mogą lepiej współdziałać swoje komponenty.
Próbka
Zapoznaj się z przykładem ułatwień dostępu w widoku niestandardowym w Androidzie TV, aby poznać sprawdzone metody dotyczące obsługa ułatwień dostępu w aplikacjach korzystających z widoków niestandardowych.