Role tlačítka na vlastním prvku (Android View)
Vlastní View/ViewGroup nastavený jako klikatelný (clickable="true") dostane fokus a reaguje na dotyk, ale TalkBack ho neohlásí jako „tlačítko" — jeho třída zůstává tím, čím doopravdy je (LinearLayout, ConstraintLayout...), a přesně podle třídy se řídí, jaká role se ohlásí.
1. Nedostatečné — jen clickable a focusable
<LinearLayout
android:id="@+id/customRow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true">
...
</LinearLayout>
Řádek je fokusovatelný a reaguje na dotyk i na dvojité poklepání v TalkBacku, ale ohlásí se podle skutečné třídy (nebo obecně), ne jako „tlačítko".
2. Správně — AccessibilityDelegate s vlastní třídou
ViewCompat.setAccessibilityDelegate(customRow, object : AccessibilityDelegateCompat() {
override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.className = Button::class.java.name
}
})
setClassName() řekne accessibility službě, že uzel „je" daná třída, i když ve skutečnosti jde o jiný View. TalkBack pak ohlásí „tlačítko" stejně, jako by šlo o skutečný Button.
3. Alternativa — vlastní popis role bez impersonace
Pokud prvek nemá odpovídat žádné skutečné widget třídě, ale přesto potřebuje vlastní pojmenování role (např. „panel nástrojů"), jde místo className nastavit roleDescription:
override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.roleDescription = "panel nástrojů"
}
Proč to takhle je
- Role v classic View systému je odvozená od skutečné třídy
View, ne od nastaveného chování (clickable) — proto samotnéclickable="true"roli nezmění. setClassName()roli nahradí impersonací existující widget třídy (Button,Switch...),setRoleDescription()dá vlastní popis role bez předstírání konkrétní třídy — použije se, když se prvek nehodí k žádné existující.- Jednodušší jednořádkové řešení v classic View systému neexistuje — role se musí nastavit ručně přes
AccessibilityDelegate, žádný widget/atribut ji nenastaví za vás.
Pravidla
- WCAG 4.1.2 (Název, role, hodnota) — role prvku musí být programově zjistitelná, ne jen odvoditelná z toho, jak se chová nebo vypadá.
Komentáře
Zatím zde nejsou žádné komentáře. Buďte první, kdo napíše svůj názor.
Přidat komentář k „Role tlačítka na vlastním prvku (Android View)“