Apps · Navigation

Barrierefreie App-Navigation

Wer mit VoiceOver oder TalkBack durch eine App wischt, bewegt sich Element für Element durch eine festgelegte Reihenfolge. Stimmt diese Reihenfolge nicht mit der sichtbaren Logik überein, fehlen Überschriften als Sprungmarken oder bleibt der Fokus nach einem Wechsel an der falschen Stelle, wird die App mühsam bis unbedienbar. Diese Seite zeigt, wie du die Fokus-Führung in nativen iOS- und Android-Apps bewusst gestaltest.

  • 9 Minuten Lesezeit
  • Stand: Juni 2026

Was App-Navigation für Hilfstechnologien bedeutet

Sehende Nutzer:innen überblicken einen App-Bildschirm in Sekunden und springen mit dem Blick dorthin, wo es weitergeht. Wer eine Hilfstechnologie nutzt, hat diesen Überblick nicht. Ein Screenreader wie VoiceOver(iOS) oder TalkBack(Android) führt linear durch die Oberfläche: Mit einem Wisch nach rechts springt der Fokus zum nächsten Element, mit einem Wisch nach links zum vorigen. Alternativ tasten Nutzer:innen den Bildschirm mit dem Finger ab und hören, was sie gerade berühren.

„App-Navigation" meint in diesem Artikel deshalb nicht nur Tab-Bars und Menüs, sondern die Reihenfolge und Struktur, in der eine Hilfstechnologie durch deine Oberfläche führt. Drei Dinge entscheiden über eine gute Bedienung: dass die Fokusreihenfolge der sichtbaren Logik folgt, dass Überschriften ein schnelles Springen erlauben, und dass der Fokus bei Wechseln (Tab-Wechsel, Dialog, neuer Bildschirm) an der richtigen Stelle landet.

Lineares Durchwischen durch einen App-Bildschirm Ein App-Bildschirm mit fünf Elementen, von Überschrift über zwei Listeneinträge bis zur Taste. Pfeile zeigen, wie der Fokus beim Wischen nach rechts der Reihe nach von Element eins bis fünf wandert. Überschrift 1 2 Listeneintrag A 3 Listeneintrag B 4 Listeneintrag C 5 Senden Wisch nach rechts Fokus: 1 zu 2 zu 3 ... Jeder Stopp wird vorgelesen, eins nach dem anderen.
Der Screenreader führt Element für Element durch den Bildschirm. Die Reihenfolge der Stopps ist nicht zufällig: Du legst sie fest, bewusst oder unbewusst.

Die Fokusreihenfolge folgt der Lese-Logik

Standardmäßig leiten beide Plattformen die Fokusreihenfolge aus der Anordnung ab: Android arbeitet die Elemente in der erwarteten Lesereihenfolge ab, also üblicherweise von links nach rechts und von oben nach unten; iOS folgt der View-Hierarchie und der visuellen Position. Solange Aufbau und Sichtbarkeit übereinstimmen, passt das. Probleme entstehen dort, wo das Layout optisch anders gruppiert ist, als der Code es anordnet, etwa bei zwei nebeneinanderliegenden Spalten oder frei positionierten Elementen.

Den Maßstab dafür liefert die WCAG 2.2, der internationale Standard für digitale Barrierefreiheit. Über das Begleitdokument WCAG2ICT und die europäische Norm EN 301 549 (Kapitel 11) gelten ihre Kriterien sinngemäß auch für Apps. Zwei davon betreffen die Reihenfolge direkt: Erfolgskriterium 1.3.2 (Bedeutungstragende Reihenfolge) verlangt, dass die richtige Lesereihenfolge programmatisch ermittelbar ist; 2.4.3 (Fokus-Reihenfolge) verlangt, dass eine sinnvolle, die Bedienbarkeit erhaltende Reihenfolge eingehalten wird. Beide sind Konformitätsstufe A, also die Basis.

Falsche gegen richtige Lesereihenfolge bei zwei Spalten Links springt der Fokus bei einem Zwei-Spalten-Layout falsch zwischen den Spalten hin und her, sodass die Sätze zerrissen werden. Rechts läuft der Fokus erst die linke Spalte vollständig ab, dann die rechte, und der Sinn bleibt erhalten. FALSCH: ZERRISSEN Dieser Satz steht links. Dieser steht rechts. 1 2 Gelesen: „Dieser Satz Dieser steht steht links. rechts." Sinn zerstört. RICHTIG: SPALTENWEISE Dieser Satz steht links. Dieser steht rechts. 1 2 Gelesen: „Dieser Satz steht links. Dieser steht rechts." Sinn bleibt erhalten.
Bei zwei Spalten reicht die reine Links-rechts-oben-unten-Logik nicht. Erst die spaltenweise Reihenfolge erhält den Sinn. Genau hier setzt du die Reihenfolge mit den folgenden Werkzeugen bewusst.

iOS: Reihenfolge und Gruppen steuern

Unter iOS bestimmst du die Reihenfolge auf drei Wegen. Innerhalb eines Containers legt accessibilityElements die Reihenfolge explizit als Liste fest. Mit accessibilitySortPriority (in SwiftUI accessibilitySortPriority ) hebst du einzelne Elemente vor: Höhere Werte werden zuerst angesteuert, der Standard ist 0. Und shouldGroupAccessibilityChildren hält die Kinder eines Containers als zusammenhängende Gruppe beieinander, sodass der Fokus sie nicht mit anderen Elementen vermischt.

iOS: Reihenfolge, Vorrang und Gruppierung

 // UIKit: Reihenfolge im Container explizit als Liste setzen 
container.accessibilityElements = [titelLabel, betragLabel, sendenButton] // UIKit: zusammengehoerige Kinder als Gruppe halten 
karteView.shouldGroupAccessibilityChildren = true // SwiftUI: Vorrang erhoehen, hoeher wird zuerst angesteuert (Standard 0) 
wichtigerHinweis
    .accessibilitySortPriority(1)

Eine Faustregel: Verlasse dich zuerst auf einen sauberen, logischen Aufbau der View-Hierarchie. Greife erst dann zu accessibilitySortPriority oder einer expliziten accessibilityElements -Liste, wenn die natürliche Reihenfolge nachweislich nicht passt. So bleibt die Reihenfolge auch bei späteren Layout-Änderungen stabil.

Android: Traversal-Reihenfolge steuern

Android nennt die Fokusreihenfolge Traversal-Reihenfolge. Im klassischen View-System verschiebst du einzelne Elemente mit den Attributen android:accessibilityTraversalBefore und android:accessibilityTraversalAfter , die jeweils auf die ID eines anderen Elements zeigen. In Jetpack Compose übernehmen das zwei Semantik-Eigenschaften: isTraversalGroup kennzeichnet eine zusammengehörige Gruppe, deren Kinder vollständig abgearbeitet werden, bevor es weitergeht; traversalIndex ordnet einzelne Elemente, wobei ein kleinerer Wert früher kommt.

Android: View-System und Jetpack Compose

 // XML (View-System): TalkBack-Reihenfolge explizit setzen 
<TextView
    android:id="@+id/preis"
    android:accessibilityTraversalAfter="@id/titel" /> // Compose: Gruppe zusammenhalten 
Row(Modifier.semantics { isTraversalGroup = true }) { // ... Kinder werden zusammenhaengend abgearbeitet 
} // Compose: einzelnes Element nach vorne ziehen (kleiner = frueher) 
Text("Hinweis", Modifier.semantics { traversalIndex = -1f })

isTraversalGroup ist das Mittel der Wahl, wenn Compose bei nebeneinanderliegenden Spalten oder frei platzierten Elementen die Reihenfolge falsch errät. Du setzt es auf das umschließende Element, etwa eine Row , Column oder Box , und steuerst innerhalb der Gruppe bei Bedarf mit traversalIndex nach.

Wissens-Karte: Reihenfolge und Struktur steuern
Aufgabe iOS Android
Reihenfolge explizit setzen accessibilityElements accessibilityTraversalBefore/After (XML)
Einzelnes Element vorziehen accessibilitySortPriority (höher zuerst) traversalIndex (kleiner zuerst)
Gruppe zusammenhalten shouldGroupAccessibilityChildren isTraversalGroup (Compose)
Als Überschrift markieren .isHeader -Trait heading() (Compose)
Fokus nach Wechsel setzen UIAccessibility.post(.screenChanged) Live-Region / Fokus auf neues Element

Überschriften als Sprungmarken

Sich durch jede einzelne Zeile zu wischen, ist auf langen Bildschirmen zäh. Deshalb bieten beide Screenreader eine Sprungnavigation über Überschriften. Unter iOS stellt man im Rotor „Überschriften" ein und springt dann mit einem Wisch nach oben oder unten von Überschrift zu Überschrift. Unter Android übernehmen das die Lesesteuerungen von TalkBack, ebenfalls mit Überschriften als einer der wählbaren Stufen. Beides funktioniert nur, wenn deine App ihre Überschriften auch als solche auszeichnet.

In SwiftUI markierst du eine Überschrift mit .accessibilityAddTraits(.isHeader) , in Jetpack Compose mit Modifier.semantics { heading() } . Damit wird aus einer optisch fetten Textzeile eine echte Sprungmarke, die VoiceOver und TalkBack in ihrer Überschriften-Navigation anbieten.

Sprungnavigation über Überschriften
Aspekt iOS / VoiceOver Android / TalkBack
Navigationsmechanik Rotor auf „Überschriften", dann Wisch hoch/runter Lesesteuerung auf „Überschriften", dann Wisch hoch/runter
Überschrift auszeichnen .isHeader -Trait heading() in den Semantics
Nutzen Schnell zwischen Abschnitten springen, ohne alles durchzuwischen Gleiches Prinzip, gleiche Erwartung der Nutzer:innen

Fokus bei Bildschirmwechseln führen

Der häufigste Navigationsfehler passiert nicht innerhalb eines Bildschirms, sondern beim Wechsel. Öffnet sich ein Dialog, wechselt ein Tab oder erscheint ein neuer Bildschirm, muss der Fokus mitgehen. Bleibt er an der alten Stelle, hören Screenreader-Nutzer:innen nicht, dass sich etwas verändert hat, und tippen ins Leere.

Unter iOS kündigst du einen größeren Wechsel mit UIAccessibility.post(notification: .screenChanged) an und übergibst gleich das Element, auf das der Fokus springen soll; für kleinere Änderungen innerhalb eines Bildschirms gibt es .layoutChanged . Unter Android setzt du den Fokus gezielt auf das neue, wichtige Element oder meldest eine Statusänderung über eine Live-Region, die TalkBack automatisch vorliest, ohne den Fokus zu verschieben.

Fokus und Ansage bei Wechseln

 // iOS: nach Bildschirmwechsel Fokus setzen und ansagen 
UIAccessibility.post(notification: .screenChanged,
                     argument: ueberschriftLabel) // Android (Compose): Statusmeldung als Live-Region ansagen 
Text(status, Modifier.semantics {
    liveRegion = LiveRegionMode.Polite
})

Typische Fallstricke

Die immer gleichen Muster machen eine technisch saubere App für die Tastatur- und Screenreader-Navigation trotzdem unbrauchbar. Sie sind fast alle schnell behoben:

Fallstricke und ihre Lösungen
Fallstrick Folge Lösung
Spalten falsch verschränkt Sätze werden zerrissen vorgelesen Gruppe bilden ( isTraversalGroup / shouldGroupAccessibilityChildren )
Keine Überschriften ausgezeichnet Sprungnavigation fehlt, alles muss durchgewischt werden .isHeader bzw. heading() setzen
Fokus bleibt nach Wechsel stehen Wechsel wird nicht bemerkt, Tippen ins Leere Fokus setzen bzw. screenChanged / Live-Region
Dialog ohne Fokusfalle Fokus wandert hinter den Dialog Hintergrund unerreichbar machen, Fokus im Dialog halten
Reihenfolge per Index erzwungen Bricht bei Layout-Änderungen, schwer wartbar Zuerst saubere Hierarchie, Index nur als Ausnahme

Zwei verbreitete Irrtümer

Mythen-Check

Was über App-Navigation oft falsch erzählt wird

„Ich setze einfach überall einen Traversal-Index, dann stimmt die Reihenfolge." Das Gegenteil tritt häufig ein. Feste Indizes über den ganzen Bildschirm sind schwer zu pflegen und brechen, sobald sich das Layout ändert. Plattform-Dokumentationen empfehlen, sich zuerst auf eine logische Hierarchie zu verlassen und Reihenfolge-Eingriffe auf die wenigen Stellen zu beschränken, an denen die automatische Reihenfolge nachweislich nicht passt.

„Wenn alle Elemente erreichbar sind, ist die Navigation barrierefrei." Erreichbarkeit ist nur die halbe Miete. Wenn die Reihenfolge unlogisch ist, Überschriften zum Springen fehlen oder der Fokus nach einem Wechsel hängenbleibt, ist jedes Element zwar vorhanden, der Weg dorthin aber mühsam. Barrierefreie Navigation heißt: erreichbar und in sinnvoller, vorhersehbarer Reihenfolge.

Wie die Screenreader, für die du das alles baust, sich tatsächlich bedienen lassen, zeigen die Artikel zu VoiceOver und TalkBack. Wie du einzelnen Elementen Bedeutung und Rolle gibst, steht unter Semantik in SwiftUI und Jetpack Compose. Die offiziellen Quellen von W3C, Apple und Google sind unten verlinkt.