Označení obrázku jako dekorativního (Jetpack Compose)
Dekorativní ikona nebo obrázek (ozdobný oddělovač, ilustrace vedle textu, který stejnou informaci už nese sám) nepotřebuje vlastní jméno pro TalkBack — pokud ho přesto dostane, čtečka ohlásí něco navíc, co k ničemu neslouží a jen zdržuje. Image a Icon v Jetpack Compose mají tenhle případ řešený přímo v parametrech, bez výchozí hodnoty — každé volání musí výslovně rozhodnout, jestli obrázek popisek má, nebo ne.
1. Jak na to
Icon(
imageVector = Icons.Default.Star,
contentDescription = null // dekorativní, vedle textu, který totéž říká slovně
)
Image(
painter = painterResource(R.drawable.header_illustration),
contentDescription = null // čistě ilustrační, nenese žádnou informaci navíc
)
contentDescription u Image i Icon nemá výchozí hodnotu — je to String? hned za zdrojem obrázku, bez = null v definici funkce. Díky tomu není možné ho „zapomenout": každé volání vás donutí napsat buď skutečný popisek, nebo null. null znamená, že prvek nenese žádnou akci ani stav, který by TalkBack měl ohlašovat — z jeho pohledu tam ikona/obrázek jako by nebyly.
2. Kdy popisek naopak patří
Icon(
imageVector = Icons.Default.Warning,
contentDescription = "Upozornění: chybný vstup"
)
Popisek patří vždycky, když obrázek nese informaci, kterou nikde jinde na obrazovce nenajdete — samostatná ikonka bez textu vedle sebe, graf, fotka, cokoliv, co byste museli slovně popsat, kdyby ho čtečka měla pochopit.
3. Když je potřeba víc než jen null
Pro obyčejnou dekorativní ikonu nebo obrázek contentDescription = null úplně stačí. Existují ale užší, jiné situace, které řeší jiné nástroje:
Modifier.semantics { hideFromAccessibility() }— prvek zůstane dostupný pro testy, ale skryje se výhradně před accessibility službami (typický příklad: vodoznak přes celou obrazovku, ozdobný oddělovač uvnitř složitější komponenty).Modifier.clearAndSetSemantics { }— když je potřeba přepsat sémantiku celého podstromu, ne jen jeden obrázek.
Tohle jsou ale řešení pro strukturální problémy jinde v komponentě, ne náhrada za contentDescription = null u prostého dekorativního obrázku.
Proč to takhle je
- Chybějící výchozí hodnota u
contentDescriptionje záměrný návrh — na rozdíl odViewsystému, kde jde atribut jednoduše vynechat, tady musí autor při každém použitíImage/Iconudělat vědomé rozhodnutí. contentDescription = nulla prázdný řetězec""nejsou totéž — prázdný řetězec Accessibility Test Framework v testech (enableAccessibilityChecks(), od Compose 1.8.0) rovnou nahlásí jako chybu, protože vypadá jako zapomenutý popisek, ne jako záměrné rozhodnutí.hideFromAccessibility()/clearAndSetSemanticsřeší jiný, širší problém (celé podstromy, testovatelnost) — pro jeden dekorativní obrázek je to zbytečně silný nástroj.
Pravidla
- WCAG 1.1.1 (Netextový obsah) — čistě dekorativní obsah nemá mít přístupné jméno vůbec, ne prázdné nebo zavádějící.
Komentáře
Zatím zde nejsou žádné komentáře. Buďte první, kdo napíše svůj názor.
Přidat komentář k „Označení obrázku jako dekorativního (Jetpack Compose)“