Jak označit text jako nadpis (Android View)
TalkBack umí přeskakovat po nadpisech stejně jako čtečky obrazovky na webu po <h1>–<h6> — jenže klasický Android View systém (XML layouty, TextView) žádné takové značení nemá. Velké tučné písmo samo o sobě nic neříká, TalkBack z něj nadpis neodvodí. Navigace po nadpisech takový TextView bez výslovného označení prostě přeskočí.
1. Jak na to — XML
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:accessibilityHeading="true"
android:text="@string/section_title" />
android:accessibilityHeading="true" je samostatný atribut, dostupný od API 28 (Android 9). Nesouvisí s textAppearance ani žádným vizuálním stylem — nastavuje se navíc, zvlášť.
2. Jak na to — v kódu
Přímo na View (funguje od API 28):
view.isAccessibilityHeading = true
Pro zpětnou kompatibilitu na starší Android verze použijte AndroidX ViewCompat — na starších API se volání bezpečně přeskočí, nespadne to:
import androidx.core.view.ViewCompat
ViewCompat.setAccessibilityHeading(view, true)
3. Co to dělá a co ne
- Je to čistě binární příznak — je/není nadpis, bez úrovně (žádná obdoba h1–h6). Vizuální hierarchii velikostí písma pořád používejte pro vzhled, ale TalkBacku žádnou úroveň nesdělí.
- Nastavení se propisuje až do
AccessibilityNodeInfo(isHeading()/setHeading()) — to je přesně to místo, ze kterého si TalkBack staví svůj seznam nadpisů na obrazovce. I vlastní accessibility service by mohla přes tohle API nadpisy na obrazovce najít.
4. Nejčastější chyba
Nastavit jen textAppearance/style s velkým tučným písmem a myslet si, že je hotovo:
<!-- TOHLE NESTAČÍ — jen vzhled, TalkBack o tom neví -->
<TextView
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:text="@string/section_title" />
Stejná past jako u HTML na webu, kde velké tučné písmo taky není nadpis, dokud nejde o skutečný <h1>–<h6> prvek. A ještě jedna varianta téhož omylu: dát do contentDescription doslova slovo „nadpis" nebo „heading" — to čtečka přečte jako text, ale navigaci po nadpisech to nijak nezapojí. Jediné, na čem navigace po nadpisech skutečně stojí, je accessibilityHeading/isHeading().
5. Jak si to ověřit
-
Ručně s TalkBackem — přepněte granularitu čtení na „Nadpisy" a projeďte obrazovku gestem; správně označený prvek se objeví v tomhle přeskakování.
-
Espresso (
androidx.test.espresso:espresso-accessibility) — automatizované kontroly přímo v UI testech, poháněné Accessibility Test Frameworkem (stejný engine, který používá i Accessibility Scanner):import androidx.test.espresso.accessibility.AccessibilityChecks init { AccessibilityChecks.enable().setRunChecksFromRootView(true) }Kontroluje širší okruh věcí (kontrast, velikost dotykové plochy, chybějící popisky) — necílí konkrétně na „mělo by tohle být nadpis", to je pořád na vašem posouzení.
Proč to takhle je
- Vzhled (
textAppearance) a sémantika (accessibilityHeading) jsou dvě oddělené věci, které se nastavují samostatně — stejný princip jako u HTML/ARIA na webu. - Chybějící úroveň nadpisu je omezení celé platformy —
AccessibilityNodeInfo.isHeading()je čistě binární, stejně jako HTML<h1>–<h6>mají úroveň, ale žádná univerzální „je to nadpis" značka na platformě úrovně nezná. ViewCompatexistuje proto, aby stejný kód fungoval napříč verzemi Androidu bez ručního větvení podleBuild.VERSION.SDK_INT— na starších API se volání jen potichu neprojeví.
Pravidla
- Analogie WCAG 2.4.6 (Nadpisy a popisky) a 1.3.1 (Info a vztahy) — princip je stejný jako na webu: struktura obsahu musí být zjistitelná programově, ne jen vizuálně.
- Google Android accessibility guidelines: nadpis musí být rozpoznatelný pro accessibility services, ne jen opticky.
Komentáře
Zatím zde nejsou žádné komentáře. Buďte první, kdo napíše svůj názor.
Přidat komentář k „Jak označit text jako nadpis (Android View)“