Android View

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á.

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 „Role tlačítka na vlastním prvku (Android View)“