Zasady dotyczące ułatwień dostępu w aplikacjach

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 actions 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:

Rysunek 1. Przykłady tworzenia elementów interfejsu wyłącznie z użyciem koloru (po lewej) oraz za pomocą kolorów, kształtów i tekstu (po prawej).

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:

Ćwiczenia z programowania

Posty na blogu