Aby pomóc użytkownikom w ułatwieniach dostępu, platforma Androida umożliwia: utworzysz usługę ułatwień dostępu, która będzie prezentować treści z aplikacji użytkownikom a także obsługiwać aplikacje w ich imieniu.
Android oferuje kilka systemowych usług ułatwień dostępu, między innymi:
- TalkBack: pomaga osobom niewidomym lub niedowidzącym. Informuje o treści przy użyciu syntetyzowany głos i wykonywanie działań w aplikacji w odpowiedzi na gesty użytkownika.
- Switch Access: pomaga osobom z niepełnosprawnością ruchową. Wyróżnia interaktywne elementy i wykonuje działania w odpowiedzi na naciśnięcie przycisku przez użytkownika. Pozwala sterowania urządzeniem za pomocą jednego lub dwóch przycisków.
Aby ułatwić osobom z niepełnosprawnościami korzystanie z aplikacji, aplikacja musi być zgodna ze sprawdzonymi metodami opisanymi na tej stronie, które bazują na wytycznych opisanych w artykule Zwiększanie możliwości aplikacji
Każda z tych sprawdzonych metod została opisana w sekcjach poniżej, mogą jeszcze bardziej poprawić ułatwienia dostępu w aplikacji:
- Oznaczanie elementów etykietami
- Użytkownicy muszą być w stanie zrozumieć treść i cel każdej interakcji i istotny element interfejsu w aplikacji.
- Dodawanie działań związanych z ułatwieniami dostępu
- Dodając działania związane z ułatwieniami dostępu, umożliwisz użytkownikom korzystania z ułatwień dostępu z usługami do wykonywania kluczowych procesów w aplikacji.
- Rozszerzanie widżetów systemowych
- Skoncentruj się na elementach widoku danych zawartych w ramach platformy, a nie na tworzenia własnych widoków niestandardowych. Klasy widoku i widżetu platformy już działają pozwalają korzystać z większości ułatwień dostępu, których potrzebuje Twoja aplikacja.
- Używaj wskazówek innych niż kolor
- Użytkownicy muszą być w stanie wyraźnie odróżnić kategorie elementów i interfejs użytkownika. Aby to zrobić, używaj wzorów i pozycji, a także koloru, by wyrazić je
- Zwiększanie dostępności treści multimedialnych
- Dodaj opisy do treści wideo lub audio aplikacji, aby użytkownicy osób oglądających takie treści nie muszą polegać wyłącznie na sygnałach wizualnych czy dźwiękowych.
Oznacz elementy etykietami
Trzeba zapewnić użytkownikom przydatne i opisowe etykiety dla każdej interaktywny element interfejsu w aplikacji. Każda etykieta musi wyjaśniać znaczenie przeznaczenia konkretnego elementu. Czytniki ekranu, takie jak TalkBack, mogą informować Cię i wysyłanie tych etykiet użytkownikom.
W większości przypadków opis elementu interfejsu określa się w układzie
pliku zasobów zawierającego ten element. Zwykle do dodawania etykiet dodaje się
z atrybutem contentDescription
, jak wyjaśniliśmy w przewodniku po tworzeniu aplikacji
przy ułatwieniach dostępu. OK
dostępnych jest też kilka innych metod oznaczania etykietami, które zostały opisane w poniższych sekcjach.
Elementy do edycji
Podczas oznaczania etykietami elementów możliwych do edytowania, takich jak
EditText
, warto pokazać.
, który zawiera przykład prawidłowych danych wejściowych w samym elemencie, oprócz
udostępniając ten przykładowy tekst czytnikom ekranu. W takich sytuacjach
można użyć atrybutu android:hint
tak jak w tym fragmencie kodu:
<!-- The hint text for en-US locale would be "Apartment, suite, or building". --> <EditText android:id="@+id/addressLine2" android:hint="@string/aptSuiteBuilding" ... />
W tej sytuacji obiekt View
musi mieć atrybut android:labelFor
.
ustawiony na identyfikator elementu EditText
. Więcej informacji znajdziesz w tych artykułach:
.
Pary elementów, w których jeden opisuje drugi
Element EditText
często ma swój
Obiekt View
, który opisuje, co użytkownicy muszą robić
wpisz w elemencie EditText
. Możesz wskazać tę relację, ustawiając
atrybutu android:labelFor
obiektu View
.
Przykład oznaczania parami takich elementów jest widoczny w tym fragmencie:
<!-- Label text for en-US locale would be "Username:" --> <TextView android:id="@+id/usernameLabel" ... android:text="@string/username" android:labelFor="@+id/usernameEntry" /> <EditText android:id="@+id/usernameEntry" ... /> <!-- Label text for en-US locale would be "Password:" --> <TextView android:id="@+id/passwordLabel" ... android:text="@string/password android:labelFor="@+id/passwordEntry" /> <EditText android:id="@+id/passwordEntry" android:inputType="textPassword" ... />
Elementy w kolekcji
Gdy dodajesz etykiety do elementów kolekcji, każda z nich musi być unikalna. Dzięki temu usługi ułatwień dostępu w systemie mogą odnosić się dokładnie do jednego podczas ogłaszania etykiety. Dzięki temu użytkownicy wiedzą, poruszają się po interfejsie użytkownika lub zaznaczają element, który już odkryli.
W szczególności umieść dodatkowy tekst lub informacje kontekstowe w
elementów w ponownie użytych układach, takich jak
RecyclerView
obiektów, dzięki czemu każdy element podrzędny jest jednoznacznie identyfikowany.
W tym celu ustaw opis treści jako część implementacji adaptera: w tym fragmencie kodu:
Kotlin
data class MovieRating(val title: String, val starRating: Integer) class MyMovieRatingsAdapter(private val myData: Array<MovieRating>): RecyclerView.Adapter<MyMovieRatingsAdapter.MyRatingViewHolder>() { class MyRatingViewHolder(val ratingView: ImageView) : RecyclerView.ViewHolder(ratingView) override fun onBindViewHolder(holder: MyRatingViewHolder, position: Int) { val ratingData = myData[position] holder.ratingView.contentDescription = "Movie ${position}: " + "${ratingData.title}, ${ratingData.starRating} stars" } }
Java
public class MovieRating { private String title; private int starRating; // ... public String getTitle() { return title; } public int getStarRating() { return starRating; } } public class MyMovieRatingsAdapter extends RecyclerView.Adapter<MyAdapter.MyRatingViewHolder> { private MovieRating[] myData; public static class MyRatingViewHolder extends RecyclerView.ViewHolder { public ImageView ratingView; public MyRatingViewHolder(ImageView iv) { super(iv); ratingView = iv; } } @Override public void onBindViewHolder(MyRatingViewHolder holder, int position) { MovieRating ratingData = myData[position]; holder.ratingView.setContentDescription("Movie " + position + ": " + ratingData.getTitle() + ", " + ratingData.getStarRating() + " stars") } }
Grupy powiązanych treści
Jeśli aplikacja wyświetla kilka elementów interfejsu, które tworzą grupę naturalną, np.
szczegółowych informacji o utworze lub cechach wiadomości, umieść te elementy w
kontenera, która jest zwykle podklasą klasy ViewGroup
. Konfigurowanie kontenera
obiektu
android:screenReaderFocusable
i atrybutu true
, a atrybuty
android:focusable
dla atrybutu false
. W ten sposób usługi ułatwień dostępu mogą prezentować
elementów' opisów treści, jeden po drugim w jednym ogłoszeniu.
Ta konsolidacja powiązanych elementów pomaga użytkownikom technologii wspomagających osoby z niepełnosprawnością
lepsze poznawanie informacji
widocznych na ekranie.
Ten fragment zawiera fragmenty treści, które odnoszą się do jednego
inny, więc element kontenera, wystąpienie ConstraintLayout
, ma swoje
Atrybut android:screenReaderFocusable
ustawiono na true
i wewnętrzny
Każdy z elementów TextView
ma atrybut android:focusable
ustawiony na
false
:
<!-- In response to a single user interaction, accessibility services announce both the title and the artist of the song. --> <ConstraintLayout android:id="@+id/song_data_container" ... android:screenReaderFocusable="true"> <TextView android:id="@+id/song_title" ... android:focusable="false" android:text="@string/my_song_title" /> <TextView android:id="@+id/song_artist" android:focusable="false" android:text="@string/my_songwriter" /> </ConstraintLayout>
Usługi ułatwień dostępu informują o elementach wewnętrznych tekstów reklamy w w danej wypowiedź, ważne jest, aby każdy opis był jak najkrótszy przy jednoczesnym przekazywaniu znaczenia elementu.
Uwaga: zwykle Unikaj tworzenia opisu treści dla grupy przez agregowanie tekstu jej dzieci. Sprawia to, że opis grupy jest niestabilny, a tekst zmian podrzędnych, opis grupy może nie być już zgodny z widocznym tekstem.
W kontekście listy lub siatki czytnik ekranu może skonsolidować tekst listy lub podrzędnych węzłów tekstowych elementu siatki. Nie należy modyfikować ogłoszeń.
Grupy zagnieżdżone
Jeśli interfejs aplikacji prezentuje informacje wielowymiarowe, takie jak
lista dni po dniach festiwalu, skorzystaj z android:screenReaderFocusable
w wewnętrznych kontenerach grup. Taki schemat oznaczania etykietami zapewnia
między liczbą powiadomień potrzebnych do wykrycia
treści i długości każdego ogłoszenia.
Poniższy fragment kodu pokazuje jedną metodę oznaczania grup wewnątrz większe grupy:
<!-- In response to a single user interaction, accessibility services announce the events for a single stage only. --> <ConstraintLayout android:id="@+id/festival_event_table" ... > <ConstraintLayout android:id="@+id/stage_a_event_column" android:screenReaderFocusable="true"> <!-- UI elements that describe the events on Stage A. --> </ConstraintLayout> <ConstraintLayout android:id="@+id/stage_b_event_column" android:screenReaderFocusable="true"> <!-- UI elements that describe the events on Stage B. --> </ConstraintLayout> </ConstraintLayout>
Nagłówki w tekście
Niektóre aplikacje korzystają z nagłówków, aby podsumowywać grupy tekstu widoczne na ekranie. Jeśli
konkretny element View
jest nagłówkiem, możesz określić jego przeznaczenie;
dla usług ułatwień dostępu przez ustawienie atrybutu
Atrybut android:accessibilityHeading
do
true
.
Użytkownicy usług ułatwień dostępu mogą przechodzić między nagłówkami zamiast między akapitami czy między słowami. Ta elastyczność zapewnia nawigacji po tekście.
Tytuły paneli ułatwień dostępu
W Androidzie 9 (poziom interfejsu API 28) i nowszym możesz podać tytuły z ułatwieniami dostępu w panoramach ekranu. Ułatwienia dostępu panel to wizualnie wyróżniająca się część okna, zawartość fragmentu. Aby usługi ułatwień dostępu mogły zrozumieć jak w oknach panelu, nadawaj opisowym tytułom panele informacyjne. Usługi ułatwień dostępu mogą dzięki temu dostarczać bardziej szczegółowe informacje użytkownikom, gdy zmieni się wygląd lub zawartość panelu.
Aby podać tytuł panelu, użyj
android:accessibilityPaneTitle
Jak w tym fragmencie kodu:
<!-- Accessibility services receive announcements about content changes that are scoped to either the "shopping cart view" section (top) or "browse items" section (bottom) --> <MyShoppingCartView android:id="@+id/shoppingCartContainer" android:accessibilityPaneTitle="@string/shoppingCart" ... /> <MyShoppingBrowseView android:id="@+id/browseItemsContainer" android:accessibilityPaneTitle="@string/browseProducts" ... />
Elementy dekoracyjne
Jeśli element w interfejsie występuje tylko ze względu na odstępy wizualne lub wygląd
ustaw jej cele,
android:importantForAccessibility
do wartości "no"
.
Dodawanie działań związanych z ułatwieniami dostępu
Użytkownicy usług ułatwień dostępu mogą łatwo wykonać wszystkie wzorzec przeglądania aplikacji. Jeśli na przykład użytkownik może przesunąć palcem po produkcie w z listy, to działanie może być narażone na dostęp usług ułatwień dostępu, aby użytkownicy w inny sposób.
Udostępnij wszystkie działania
albo TalkBack, Voice Access lub Switch Access może potrzebować alternatywnych sposobów realizacji określonych procesów aplikację. W przypadku działań związanych z gestami, takimi jak przeciąganie i upuszczanie czy przesuwanie: aplikacja może ujawniać działania w sposób dostępny dla użytkowników usług ułatwień dostępu.
Przy użyciu działań związanych z ułatwieniami dostępu, aplikacja może zapewniać użytkownikom alternatywne sposoby na wykonanie działania
Jeśli na przykład aplikacja umożliwia użytkownikom przesuwanie palcem po produkcie, możesz też udostępnić funkcję za pomocą niestandardowego działania ułatwień dostępu, na przykład:
Kotlin
ViewCompat.addAccessibilityAction( // View to add accessibility action itemView, // Label surfaced to user by an accessibility service getText(R.id.archive) ) { _, _ -> // Same method executed when swiping on itemView archiveItem() true }
Java
ViewCompat.addAccessibilityAction( // View to add accessibility action itemView, // Label surfaced to user by an accessibility service getText(R.id.archive), (view, arguments) -> { // Same method executed when swiping on itemView archiveItem(); return true; } );
With the custom accessibility action implemented, users can access the action through the actions menu.
Make available actions understandable
When a view supports actions such as touch & hold, an accessibility service such as TalkBack announces it as "Double tap and hold to long press."
This generic announcement doesn't give the user any context about what a touch & hold action does.
To make this announcement more descriptive, you can replace the accessibility action’s announcement like so:
Kotlin
ViewCompat.replaceAccessibilityAction( // View that contains touch & hold action itemView, AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK, // Announcement read by TalkBack to surface this action getText(R.string.favorite), null )
Java
ViewCompat.replaceAccessibilityAction( // View that contains touch & hold action itemView, AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK, // Announcement read by TalkBack to surface this action getText(R.string.favorite), null );
This results in TalkBack announcing "Double tap and hold to favorite," helping users understand the purpose of the action.
Extend system widgets
Note: When you design your app's UI, use or extend
system-provided widgets that are as far down Android's class hierarchy as
possible. System-provided widgets that are far down the hierarchy already
have most of the accessibility capabilities your app needs. It's easier
to extend these system-provided widgets than to create your own from the more
generic View
,
ViewCompat
,
Canvas
, and
CanvasCompat
classes.
If you must extend View
or Canvas
directly, which
might be necessary for a highly customized experience or a game level, see
Make custom views more
accessible.
This section uses the example of implementing a special type of
Switch
called TriSwitch
while following
best practices around extending system widgets. A TriSwitch
object works similarly to a Switch
object, except that each instance of
TriSwitch
allows the user to toggle among three possible states.
Extend from far down the class hierarchy
The Switch
object inherits from several framework UI classes in its hierarchy:
View ↳ TextView ↳ Button ↳ CompoundButton ↳ Switch
Najlepiej jest, aby nowa klasa TriSwitch
rozszerzała możliwości bezpośrednio z Switch
.
zajęcia. Dzięki temu ułatwienia dostępu w Androidzie
platforma
zapewnia większość ułatwień dostępu klasy TriSwitch
Potrzebuje:
- Ułatwienia dostępu: informacje dla systemu na temat sposobu działania ułatwień dostępu.
usługi mogą emulować wszystkie możliwe dane wejściowe użytkownika wykonywane na urządzeniu
TriSwitch
obiektu. (Odziedziczone z:View
). - Zdarzenia związane z ułatwieniami dostępu: informacje dla usług ułatwień dostępu na temat każdego
możliwe, że wygląd obiektu
TriSwitch
może się zmienić, gdy ekran odświeżenia lub aktualizacji. (Odziedziczone z:View
). - Cechy: szczegółowe informacje o każdym obiekcie
TriSwitch
, takie jak całej zawartości wyświetlanego tekstu. (Odziedziczone z:TextView
). - Informacje o stanie: opis bieżącego stanu obiektu
TriSwitch
, na przykład „zaznaczone” lub „odznaczone”. (Odziedziczone z:CompoundButton
). - Tekstowy opis stanu: tekstowe objaśnienie poszczególnych stanów.
co reprezentuje. (Odziedziczone z:
Switch
).
To zachowanie klasy Switch
i jej superklas jest prawie
takie samo zachowanie dla TriSwitch
obiektów. Dlatego implementacja może
skupmy się na zwiększeniu liczby możliwych stanów z 2 do 3.
Definiowanie zdarzeń niestandardowych
Rozszerzając widżet systemowy, prawdopodobnie zmieniasz sposób działania z niektórym widżetem. Ważne jest zdefiniowanie tych zmian interakcji aby usługi ułatwień dostępu mogły aktualizować widżet aplikacji tak, jakby użytkownik korzysta bezpośrednio z widżetu.
Ogólnie rzecz biorąc, w przypadku każdego wywołania zwrotnego opartego na wyświetleniu, które zastępujesz,
musisz też ponownie zdefiniować odpowiednie działanie ułatwień dostępu przez zastąpienie
ViewCompat.replaceAccessibilityAction()
W testach aplikacji możesz sprawdzić działanie tych na nowo zdefiniowanych działań,
połączenia
ViewCompat.performAccessibilityAction()
Jak ta zasada może działać w przypadku obiektów TriSwitch
W przeciwieństwie do zwykłego obiektu Switch
kliknięcie obiektu TriSwitch
powoduje cykliczne
trzech możliwych stanów. W związku z tym odpowiedni poziom ułatwień dostępu w usłudze ACTION_CLICK
działanie wymaga aktualizacji:
Kotlin
class TriSwitch(context: Context) : Switch(context) { // 0, 1, or 2 var currentState: Int = 0 private set init { updateAccessibilityActions() } private fun updateAccessibilityActions() { ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK, action-label) { view, args -> moveToNextState() }) } private fun moveToNextState() { currentState = (currentState + 1) % 3 } }
Java
public class TriSwitch extends Switch { // 0, 1, or 2 private int currentState; public int getCurrentState() { return currentState; } public TriSwitch() { updateAccessibilityActions(); } private void updateAccessibilityActions() { ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK, action-label, (view, args) -> moveToNextState()); } private void moveToNextState() { currentState = (currentState + 1) % 3; } }
Używaj wskazówek innych niż kolor.
Aby pomóc użytkownikom z wadą wzroku, używaj innych sygnałów niż kolor. odróżniania elementów interfejsu na ekranach aplikacji. Te techniki mogą Mogą wykorzystywać różne kształty lub rozmiary czy dodawać tekst lub wzory wizualne, lub dodając sygnały dźwiękowe lub dotykowe (reakcje haptyczne), różnice między nimi.
Rysunek 1 przedstawia dwie wersje aktywności. Jedna wersja używa tylko koloru, rozróżniają 2 możliwe działania w przepływie pracy. Inna wersja używa Sprawdzoną metodą jest uwzględnianie kształtów i tekstu oprócz kolorów Przedstaw różnice między tymi opcjami:
Zwiększanie dostępności treści multimedialnych
Jeśli tworzysz aplikację, która zawiera treści multimedialne, np. klip wideo lub nagrania dźwiękowego, spróbuj zapewnić użytkownikom różnego rodzaju do zrozumienia tego materiału. W szczególności zachęć Cię do wykonania następujących czynności:
- Uwzględnij elementy sterujące, które umożliwiają użytkownikom wstrzymywanie lub zatrzymywanie multimediów, zmienianie głośność lub napisy.
- Jeśli film zawiera informacje kluczowe dla realizacji przepływu pracy, muszą udostępniać te same treści w innym formacie, na przykład w formie transkrypcji.
Dodatkowe materiały
Aby dowiedzieć się więcej o ułatwieniach dostępu w aplikacji, przeczytaj te artykuły: dodatkowe materiały: