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.
Rysunek 1. Diagramy przedstawiające działanie systemu z włączoną i wyłączoną funkcją TalkBack.
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.