Android View

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á.
  • ViewCompat existuje proto, aby stejný kód fungoval napříč verzemi Androidu bez ručního větvení podle Build.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.

Zdroje

Štítky

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)“