Przejdź do treści głównej
Wersja: 0.81

Dostępność

Nieoficjalne Tłumaczenie Beta

Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →

Zarówno Android, jak i iOS udostępniają API do integracji aplikacji z technologiami wspomagającymi, takimi jak wbudowane czytniki ekranu VoiceOver (iOS) i TalkBack (Android). React Native oferuje komplementarne API, które pozwalają Twojej aplikacji obsłużyć wszystkich użytkowników.

informacja

Podejścia Androida i iOS różnią się nieznacznie, dlatego implementacje w React Native mogą się różnić w zależności od platformy.

Właściwości dostępności

accessible

Gdy ustawione na true, oznacza że widok jest wykrywalny przez technologie wspomagające, takie jak czytniki ekranu czy klawiatury sprzętowe. Należy pamiętać, że nie gwarantuje to automatycznie fokusu przez VoiceOver lub TalkBack. Istnieje kilka powodów takiego zachowania, np. ograniczenie zagnieżdżonych elementów dostępności w VoiceOver lub preferowanie fokusowania elementów nadrzędnych w TalkBack.

Domyślnie wszystkie elementy interaktywne (touchable) są dostępne.

W Androidzie accessible jest mapowane na natywne focusable. W iOS odpowiada natywnemu isAccessibilityElement.

tsx
<View>
<View accessible={true} />
<View />
</View>

W powyższym przykładzie fokus dostępności jest dostępny tylko dla pierwszego widoku potomnego z właściwością accessible, a nie dla rodzica lub rodzeństwa bez accessible.

accessibilityLabel

Gdy widok jest oznaczony jako dostępny, dobrym praktykiem jest ustawienie accessibilityLabel, aby użytkownicy VoiceOver lub TalkBack wiedzieli, który element wybrali. Czytnik ekranu odczyta ten ciąg znaków po wybraniu powiązanego elementu.

Aby użyć, ustaw właściwość accessibilityLabel na dowolny ciąg znaków w Twoim komponencie View, Text lub Touchable:

tsx
<TouchableOpacity
accessible={true}
accessibilityLabel="Tap me!"
onPress={onPress}>
<View style={styles.button}>
<Text style={styles.buttonText}>Press me!</Text>
</View>
</TouchableOpacity>

W powyższym przykładzie accessibilityLabel w elemencie TouchableOpacity domyślnie przyjmie wartość "Naciśnij mnie!". Etykieta jest tworzona przez połączenie wszystkich węzłów tekstowych potomnych, oddzielonych spacjami.

accessibilityLabelledBy
Android

Odwołanie do innego elementu za pomocą nativeID używane do budowania złożonych formularzy. Wartość accessibilityLabelledBy powinna odpowiadać nativeID powiązanego elementu:

tsx
<View>
<Text nativeID="formLabel">Label for Input Field</Text>
<TextInput
accessibilityLabel="input"
accessibilityLabelledBy="formLabel"
/>
</View>

W powyższym przykładzie czytnik ekranu ogłasza Input, Edit Box for Label for Input Field podczas fokusowania TextInput.

accessibilityHint

Podpowiedź dostępności może dostarczyć dodatkowego kontekstu użytkownikowi dotyczącego wyniku akcji, gdy sama etykieta nie jest wystarczająco jasna.

Przypisz właściwości accessibilityHint dowolny ciąg znaków w Twoim komponencie View, Text lub Touchable:

tsx
<TouchableOpacity
accessible={true}
accessibilityLabel="Go back"
accessibilityHint="Navigates to the previous screen"
onPress={onPress}>
<View style={styles.button}>
<Text style={styles.buttonText}>Back</Text>
</View>
</TouchableOpacity>
iOS

W powyższym przykładzie VoiceOver odczyta podpowiedź po etykiecie, jeśli użytkownik włączył podpowiedzi w ustawieniach VoiceBack na urządzeniu. Więcej o wytycznych dotyczących accessibilityHint w dokumentacji iOS Developer Docs

Android

W powyższym przykładzie TalkBack odczyta podpowiedź po etykiecie. Obecnie nie ma możliwości wyłączenia podpowiedzi w Androidzie.

accessibilityLanguage
iOS

Używając właściwości accessibilityLanguage, czytnik ekranu zrozumie, którego języka użyć podczas odczytywania etykiety, wartości i podpowiedzi elementu. Podana wartość ciągu znaków musi spełniać specyfikację BCP 47.

tsx
<View
accessible={true}
accessibilityLabel="Pizza"
accessibilityLanguage="it-IT">
<Text>🍕</Text>
</View>

accessibilityIgnoresInvertColors
iOS

Inwersja kolorów ekranu to funkcja dostępności w iOS i iPadOS dla osób z daltonizmem, słabowidzących lub niedowidzących. Jeśli istnieje widok, którego nie chcesz invertować (np. zdjęcie), ustaw tę właściwość na true.

accessibilityLiveRegion
Android

Gdy komponenty dynamicznie się zmieniają, chcemy aby TalkBack powiadamiał użytkownika końcowego. Umożliwia to właściwość accessibilityLiveRegion. Może przyjmować wartości none, polite oraz assertive:

  • none Usługi dostępności nie powinny ogłaszać zmian w tym widoku.

  • polite Usługi dostępności powinny ogłaszać zmiany w tym widoku.

  • assertive Usługi dostępności powinny przerwać trwającą mowę, aby natychmiast ogłosić zmiany w tym widoku.

tsx
<TouchableWithoutFeedback onPress={addOne}>
<View style={styles.embedded}>
<Text>Click me</Text>
</View>
</TouchableWithoutFeedback>
<Text accessibilityLiveRegion="polite">
Clicked {count} times
</Text>

W powyższej metodzie addOne zmienia zmienną stanu count. Po aktywacji TouchableWithoutFeedback, TalkBack odczytuje tekst w widoku Text dzięki właściwości accessibilityLiveRegion="polite".

accessibilityRole

accessibilityRole komunikuje cel komponentu użytkownikowi technologii wspomagających.

accessibilityRole może przyjmować jedną z następujących wartości:

  • adjustable Używane, gdy element może być "regulowany" (np. suwak).

  • alert Używany, gdy element zawiera ważny tekst do przedstawienia użytkownikowi.

  • button Używany, gdy element powinien być traktowany jak przycisk.

  • checkbox Używany, gdy element reprezentuje pole wyboru, które może być zaznaczone, odznaczone lub mieć stan mieszany.

  • combobox Używany, gdy element reprezentuje kombi pole umożliwiające wybór spośród kilku opcji.

  • header Używane, gdy element działa jako nagłówek sekcji treści (np. tytuł paska nawigacyjnego).

  • image Używane, gdy element powinien być traktowany jako obraz. Może być łączony z przyciskiem lub linkiem.

  • imagebutton Używane, gdy element powinien być traktowany jako przycisk i jednocześnie jest obrazem.

  • keyboardkey Używane, gdy element działa jako klawisz klawiatury.

  • link Używany, gdy element powinien być traktowany jako odnośnik.

  • menu Używany, gdy komponent jest menu wyboru.

  • menubar Używany, gdy komponent jest kontenerem wielu menu.

  • menuitem Używany do reprezentacji elementu w menu.

  • none Używany, gdy element nie ma przypisanej roli.

  • progressbar Używany do reprezentacji komponentu pokazującego postęp zadania.

  • radio Używany do reprezentacji przycisku opcji.

  • radiogroup Używany do reprezentacji grupy przycisków opcji.

  • scrollbar Używany do reprezentacji paska przewijania.

  • search Używane, gdy pole tekstowe powinno być traktowane jako pole wyszukiwania.

  • spinbutton Używany do reprezentacji przycisku otwierającego listę opcji.

  • summary Używany, gdy element może dostarczyć szybkiego podsumowania bieżącego stanu aplikacji przy jej uruchomieniu.

  • switch Używany do reprezentacji przełącznika włącz/wyłącz.

  • tab Używany do reprezentacji zakładki.

  • tablist Używane do reprezentowania listy zakładek.

  • text Używane, gdy element powinien być traktowany jako statyczny tekst, który nie może się zmieniać.

  • timer Używane do reprezentowania timera.

  • togglebutton Używane do reprezentowania przycisku przełączanego. Powinien być używany z accessibilityState checked, aby wskazać, czy przycisk jest włączony czy wyłączony.

  • toolbar Używane do reprezentowania paska narzędzi (kontenera przycisków akcji lub komponentów).

  • grid Używane z ScrollView, VirtualizedList, FlatList lub SectionList do reprezentowania siatki. Dodaje ogłoszenia wejścia/wyjścia z siatki dla GridView na Androidzie.

accessibilityShowsLargeContentViewer
iOS

Wartość logiczna określająca, czy widżet dużych treści jest wyświetlany po długim naciśnięciu elementu.

Dostępne w iOS 13.0 i nowszych.

accessibilityLargeContentTitle
iOS

Ciąg znaków używany jako tytuł przeglądarki dużych treści podczas jej wyświetlania.

Wymaga ustawienia accessibilityShowsLargeContentViewer na true.

tsx
<View
accessibilityShowsLargeContentViewer={true}
accessibilityLargeContentTitle="Home Tab">
<Text>Home</Text>
</View>

accessibilityState

Opisuje bieżący stan komponentu użytkownikowi technologii asystujących.

accessibilityState jest obiektem zawierającym następujące pola:

NameDescriptionTypeRequired
disabledIndicates whether the element is disabled or not.booleanNo
selectedIndicates whether a selectable element is currently selected or not.booleanNo
checkedIndicates the state of a checkable element. This field can either take a boolean or the "mixed" string to represent mixed checkboxes.boolean or 'mixed'No
busyIndicates whether an element is currently busy or not.booleanNo
expandedIndicates whether an expandable element is currently expanded or collapsed.booleanNo

Aby użyć, ustaw accessibilityState jako obiekt o określonej definicji.

accessibilityValue

Reprezentuje bieżącą wartość komponentu. Może to być opis tekstowy wartości lub dla komponentów zakresowych (np. suwaków czy pasków postępu) zawiera informacje o zakresie (minimalna, bieżąca i maksymalna).

accessibilityValue jest obiektem zawierającym następujące pola:

NameDescriptionTypeRequired
minThe minimum value of this component's range.integerRequired if now is set.
maxThe maximum value of this component's range.integerRequired if now is set.
nowThe current value of this component's range.integerNo
textA textual description of this component's value. Will override min, now, and max if set.stringNo

accessibilityViewIsModal
iOS

Wartość logiczna wskazująca, czy VoiceOver powinien ignorować elementy w widokach będących rodzeństwem odbiorcy.

Przykładowo, w oknie zawierającym rodzeństwo widoków A i B, ustawienie accessibilityViewIsModal na true dla widoku B spowoduje, że VoiceOver zignoruje elementy w widoku A. Natomiast jeśli widok B zawiera widok potomny C i ustawisz accessibilityViewIsModal na true dla widoku C, VoiceOver nie zignoruje elementów w widoku A.

accessibilityElementsHidden
iOS

Wartość logiczna wskazująca, czy dany element dostępności i wszystkie zawarte w nim elementy są ukryte.

Przykładowo, w oknie zawierającym rodzeństwo widoków A i B, ustawienie accessibilityElementsHidden na true dla widoku B powoduje, że VoiceOver ignoruje widok B i jego elementy. Odpowiada to właściwości Androida importantForAccessibility="no-hide-descendants".

aria-valuemax

Reprezentuje maksymalną wartość dla komponentów zakresowych, takich jak suwaki czy paski postępu.

aria-valuemin

Reprezentuje minimalną wartość dla komponentów zakresowych, takich jak suwaki czy paski postępu.

aria-valuenow

Reprezentuje bieżącą wartość dla komponentów zakresowych, takich jak suwaki czy paski postępu.

aria-valuetext

Reprezentuje tekstowy opis komponentu.

aria-busy

Wskazuje, że element jest modyfikowany, a technologie asystujące powinny zaczekać z powiadomieniem użytkownika do zakończenia zmian.

TypeDefault
booleanfalse

aria-checked

Wskazuje stan elementu z możliwością zaznaczenia. Przyjmuje wartość logiczną lub ciąg "mixed" dla pól wyboru w stanie mieszanym.

TypeDefault
boolean, 'mixed'false

aria-disabled

Wskazuje, że element jest widoczny, ale wyłączony - nie można go edytować ani obsługiwać.

TypeDefault
booleanfalse

aria-expanded

Wskazuje, czy rozwijany element jest aktualnie rozwinięty czy zwinięty.

TypeDefault
booleanfalse

aria-hidden

Wskazuje, czy element jest ukryty przed technologiami asystującymi.

Przykładowo, w oknie zawierającym rodzeństwo widoków A i B, ustawienie aria-hidden na true dla widoku B powoduje, że VoiceOver ignoruje element B i jego elementy potomne.

TypeDefault
booleanfalse

aria-label

Definiuje wartość tekstową etykietującą interaktywny element.

Type
string

aria-labelledby
Android

Identyfikuje element etykietujący bieżący element. Wartość aria-labelledby musi odpowiadać nativeID powiązanego elementu:

tsx
<View>
<Text nativeID="formLabel">Label for Input Field</Text>
<TextInput aria-label="input" aria-labelledby="formLabel" />
</View>
Type
string

aria-live
Android

Wskazuje, że element będzie aktualizowany i opisuje rodzaje aktualizacji, których agenty użytkownika, technologie asystujące oraz użytkownik mogą się spodziewać w obszarze dynamicznym (live region).

  • off Usługi dostępności nie powinny ogłaszać zmian w tym widoku.

  • polite Usługi dostępności powinny ogłaszać zmiany w tym widoku.

  • assertive Usługi dostępności powinny przerwać trwającą mowę, aby natychmiast ogłosić zmiany w tym widoku.

TypeDefault
enum('assertive', 'off', 'polite')'off'

aria-modal
iOS

Wartość logiczna wskazująca, czy VoiceOver powinien ignorować elementy wewnątrz widoków będących rodzeństwem elementu docelowego.

TypeDefault
booleanfalse

aria-selected

Wskazuje, czy wybieralny element jest aktualnie zaznaczony.

Type
boolean

importantForAccessibility
Android

W przypadku dwóch nakładających się komponentów UI z tym samym rodzicem, domyślny fokus dostępności może mieć nieprzewidywalne zachowanie. Właściwość importantForAccessibility rozwiązuje ten problem, kontrolując czy widok generuje zdarzenia dostępności i czy jest zgłaszany usługom dostępności. Może być ustawiona na auto, yes, no i no-hide-descendants (ostatnia wartość wymusi ignorowanie komponentu i wszystkich jego potomków przez usługi dostępności).

tsx
<View style={styles.container}>
<View
style={[styles.layout, {backgroundColor: 'green'}]}
importantForAccessibility="yes">
<Text>First layout</Text>
</View>
<View
style={[styles.layout, {backgroundColor: 'yellow'}]}
importantForAccessibility="no-hide-descendants">
<Text>Second layout</Text>
</View>
</View>

W powyższym przykładzie układ yellow i jego potomkowie są całkowicie niewidoczni dla TalkBack i innych usług dostępności. Dzięki temu możemy używać nakładających się widoków z tym samym rodzicem bez dezorientowania TalkBack.

onAccessibilityEscape
iOS

Przypisz tę właściwość do funkcji niestandardowej, która zostanie wywołana, gdy użytkownik wykona gest "escape" (dwoma palcami w kształcie litery Z). Funkcja escape powinna cofać się hierarchicznie w interfejsie użytkownika – może to oznaczać przejście w górę lub wstecz w hierarchii nawigacji albo zamknięcie modala. Jeśli wybrany element nie ma funkcji onAccessibilityEscape, system spróbuje przejść w górę hierarchii widoków, aż znajdzie odpowiedni widok lub wyda dźwięk błędu, gdy go nie znajdzie.

onAccessibilityTap
iOS

Użyj tej właściwości, aby przypisać niestandardową funkcję, która zostanie wywołana, gdy użytkownik dwukrotnie stuknie w dostępny element podczas jego zaznaczenia.

onMagicTap
iOS

Przypisz tę właściwość do funkcji niestandardowej, która zostanie wywołana przy geście "magic tap" (podwójne stuknięcie dwoma palcami). Funkcja magic tap powinna wykonać najbardziej istotną akcję dostępną w komponencie. W aplikacji Telefon na iPhone'ie magic tap odbiera lub kończy połączenie. Jeśli wybrany element nie ma funkcji onMagicTap, system przejdzie w górę hierarchii widoków, aż znajdzie widok, który ją posiada.

role

role komunikuje cel komponentu i ma pierwszeństwo przed właściwością accessibilityRole.

role może przyjąć jedną z następujących wartości:

  • alert Używany, gdy element zawiera ważny tekst do przedstawienia użytkownikowi.

  • button Używany, gdy element powinien być traktowany jak przycisk.

  • checkbox Używany, gdy element reprezentuje pole wyboru, które może być zaznaczone, odznaczone lub mieć stan mieszany.

  • combobox Używany, gdy element reprezentuje kombi pole umożliwiające wybór spośród kilku opcji.

  • grid Używany z ScrollView, VirtualizedList, FlatList lub SectionList do reprezentacji siatki. Dodaje ogłoszenia wejścia/wyjścia z siatki dla androida GridView.

  • heading Używany, gdy element działa jako nagłówek sekcji treści (np. tytuł paska nawigacyjnego).

  • img Używany, gdy element powinien być traktowany jako obraz. Może być łączony np. z przyciskiem lub linkiem.

  • link Używany, gdy element powinien być traktowany jako odnośnik.

  • list Używany do identyfikacji listy elementów.

  • listitem Używany do identyfikacji elementu na liście.

  • menu Używany, gdy komponent jest menu wyboru.

  • menubar Używany, gdy komponent jest kontenerem wielu menu.

  • menuitem Używany do reprezentacji elementu w menu.

  • none Używany, gdy element nie ma przypisanej roli.

  • presentation Używany, gdy element nie ma przypisanej roli.

  • progressbar Używany do reprezentacji komponentu pokazującego postęp zadania.

  • radio Używany do reprezentacji przycisku opcji.

  • radiogroup Używany do reprezentacji grupy przycisków opcji.

  • scrollbar Używany do reprezentacji paska przewijania.

  • searchbox Używany, gdy pole tekstowe powinno być też traktowane jako pole wyszukiwania.

  • slider Używany, gdy element można "dostosować" (np. suwak).

  • spinbutton Używany do reprezentacji przycisku otwierającego listę opcji.

  • summary Używany, gdy element może dostarczyć szybkiego podsumowania bieżącego stanu aplikacji przy jej uruchomieniu.

  • switch Używany do reprezentacji przełącznika włącz/wyłącz.

  • tab Używany do reprezentacji zakładki.

  • tablist Używane do reprezentowania listy zakładek.

  • timer Używane do reprezentowania timera.

  • toolbar Używane do reprezentowania paska narzędzi (kontenera przycisków akcji lub komponentów).

Akcje dostępności

Akcje dostępności pozwalają technologiom asystującym programowo wywoływać działania komponentu. Aby obsługiwać akcje dostępności, komponent musi wykonać dwie rzeczy:

  • Zdefiniować listę obsługiwanych akcji poprzez właściwość accessibilityActions.

  • Zaimplementować funkcję onAccessibilityAction do obsługi żądań akcji.

Właściwość accessibilityActions powinna zawierać listę obiektów akcji. Każdy obiekt akcji powinien zawierać następujące pola:

NameTypeRequired
namestringYes
labelstringNo

Akcje reprezentują albo standardowe działania (jak kliknięcie przycisku czy regulacja suwaka), albo niestandardowe akcje specyficzne dla danego komponentu (np. usuwanie wiadomości e-mail). Pole name jest wymagane zarówno dla akcji standardowych, jak i niestandardowych, natomiast label jest opcjonalne dla akcji standardowych.

Dodając obsługę akcji standardowych, name musi być jednym z następujących:

  • 'magicTap' - Tylko iOS - Gdy fokus VoiceOver jest na lub wewnątrz komponentu, użytkownik podwójnie stuknął dwoma palcami.

  • 'escape' - Tylko iOS - Gdy fokus VoiceOver jest na lub wewnątrz komponentu, użytkownik wykonał gest przeciągnięcia dwoma palcami (lewo, prawo, lewo).

  • 'activate' - Aktywuj komponent. Powinno wykonać tę samą akcję z technologią asystującą lub bez. Wywoływane, gdy użytkownik czytnika ekranu podwójnie stuknie w komponent.

  • 'increment' - Zwiększ wartość w regulowanym komponencie. W iOS VoiceOver generuje tę akcję, gdy komponent ma rolę 'adjustable', a użytkownik ustawi na nim fokus i przesunie palcem w górę. W Androidzie TalkBack generuje tę akcję, gdy użytkownik ustawi fokus dostępności na komponencie i naciśnie przycisk zwiększania głośności.

  • 'decrement' - Zmniejsz wartość w regulowanym komponencie. W iOS VoiceOver generuje tę akcję, gdy komponent ma rolę 'adjustable', a użytkownik ustawi na nim fokus i przesunie palcem w dół. W Androidzie TalkBack generuje tę akcję, gdy użytkownik ustawi fokus dostępności na komponencie i naciśnie przycisk zmniejszania głośności.

  • 'longpress' - Tylko Android - Ta akcja jest generowana, gdy użytkownik ustawi fokus dostępności na komponencie, a następnie podwójnie stuknie i przytrzyma jeden palec na ekranie. Powinno wykonać tę samą akcję z technologią asystującą lub bez.

  • 'expand' - Tylko Android - Ta akcja "rozwija" komponent, dzięki czemu TalkBack poda komunikat o "rozwinięciu".

  • 'collapse' - Tylko Android - Ta akcja "zwija" komponent, dzięki czemu TalkBack poda komunikat o "złożeniu".

Pole label jest opcjonalne dla akcji standardowych i często nieużywane przez technologie asystujące. Dla akcji niestandardowych jest to zlokalizowany ciąg znaków zawierający opis akcji prezentowany użytkownikowi.

Aby obsłużyć żądania akcji, komponent musi zaimplementować funkcję onAccessibilityAction. Jedynym argumentem tej funkcji jest zdarzenie zawierające nazwę akcji do wykonania. Poniższy przykład z RNTester pokazuje, jak utworzyć komponent definiujący i obsługujący kilka akcji niestandardowych.

tsx
<View
accessible={true}
accessibilityActions={[
{name: 'cut', label: 'cut'},
{name: 'copy', label: 'copy'},
{name: 'paste', label: 'paste'},
]}
onAccessibilityAction={event => {
switch (event.nativeEvent.actionName) {
case 'cut':
Alert.alert('Alert', 'cut action success');
break;
case 'copy':
Alert.alert('Alert', 'copy action success');
break;
case 'paste':
Alert.alert('Alert', 'paste action success');
break;
}
}}
/>

Sprawdzanie, czy czytnik ekranu jest włączony

API AccessibilityInfo pozwala sprawdzić, czy czytnik ekranu jest obecnie aktywny. Szczegóły znajdziesz w dokumentacji AccessibilityInfo.

Sending Accessibility Events
Android

Czasem przydatne jest wywołanie zdarzenia dostępności na komponencie interfejsu (np. gdy niestandardowy widok pojawia się na ekranie lub ustawia fokus dostępności na widoku). Natywny moduł UIManager udostępnia metodę ‘sendAccessibilityEvent’ w tym celu. Przyjmuje dwa argumenty: tag widoku i typ zdarzenia. Obsługiwane typy zdarzeń to typeWindowStateChanged, typeViewFocused i typeViewClicked.

tsx
import {Platform, UIManager, findNodeHandle} from 'react-native';

if (Platform.OS === 'android') {
UIManager.sendAccessibilityEvent(
findNodeHandle(this),
UIManager.AccessibilityEventTypes.typeViewFocused,
);
}

Testing TalkBack Support
Android

Aby włączyć TalkBack, przejdź do aplikacji Ustawienia na urządzeniu lub emulatorze Android. Stuknij w Dostępność, a następnie w TalkBack. Przełącz przełącznik "Używanie usługi", aby włączyć lub wyłączyć funkcję.

Emulatory Android nie mają domyślnie zainstalowanego TalkBack. Możesz zainstalować TalkBack na emulatorze poprzez Google Play Store. Upewnij się, że wybierasz emulator z zainstalowanym sklepem Google Play. Takie emulatory są dostępne w Android Studio.

Możesz użyć skrótu klawiszem głośności do przełączania TalkBack. Aby włączyć ten skrót, przejdź do aplikacji Ustawienia, następnie Dostępność. Na górze włącz opcję skrótu klawiszem głośności.

Aby użyć skrótu klawiszem głośności, przytrzymaj oba klawisze głośności przez 3 sekundy, aby uruchomić narzędzie dostępności.

Dodatkowo, jeśli wolisz, możesz przełączać TalkBack z linii poleceń za pomocą:

shell
# disable
adb shell settings put secure enabled_accessibility_services com.android.talkback/com.google.android.marvin.talkback.TalkBackService

# enable
adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService

Testing VoiceOver Support
iOS

Aby włączyć VoiceOver na urządzeniu z iOS lub iPadOS, przejdź do aplikacji Ustawienia, stuknij w Ogólne, a następnie w Dostępność. Znajdziesz tam wiele narzędzi pomagających zwiększyć użyteczność urządzeń, w tym VoiceOver. Aby włączyć VoiceOver, stuknij w VoiceOver w sekcji "Wzrok" i przełącz przełącznik u góry.

Na samym dole ustawień Dostępności znajduje się "Skrót Dostępności". Możesz go użyć do przełączania VoiceOver poprzez potrójne kliknięcie przycisku Home.

VoiceOver nie jest dostępny w symulatorze, ale możesz użyć Accessibility Inspector z Xcode, aby wykorzystać macOS VoiceOver przez aplikację. Pamiętaj, że najlepiej testować na fizycznym urządzeniu, ponieważ macOS VoiceOver może dawać inne doświadczenia.

Dodatkowe zasoby