Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I modify the TalkBack usage hint for a clickable View on Android?

By default, clickable Views on Android will be rendered with a usage hint that's read aloud (if TalkBack is enabled and the user focuses on that View) after the content description:

"Double tap to activate"

Can I change this so it reads out something less abstract and more specific to my app? Like:

"Double tap to play video"

like image 684
ataulm Avatar asked Jan 05 '17 23:01

ataulm


1 Answers

Yes, this is absolutely possible!

Overriding the onInitializeAccessibilityNodeInfo method

If you have a custom View, you can override the onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) method and add an action with the ACTION_CLICK ID, to override the label:

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    info.addAction(
            new AccessibilityNodeInfo.AccessibilityAction(
                    AccessibilityNodeInfo.ACTION_CLICK,
                    "play video"
            )
    );
}

If that View has a click listener, then by adding this new Action, you'll have overridden the default label so TalkBack will say "Double tap to " instead.

This is only available on API 21 - what if you wanted something that worked on a lower API version or wanted to set a custom usage hint on a non-custom View? You can use ViewCompat and AccessibilityDelegateCompat!

Using an AccessibilityDelegate instead

It's very similar - you can override the equivalent method in a custom AccessibilityDelegate that you extend:

public static class PlayVideoAccessibilityDelegate extends AccessibilityDelegateCompat {

    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        info.addAction(
                new AccessibilityNodeInfoCompat.AccessibilityActionCompat(
                        AccessibilityNodeInfoCompat.ACTION_CLICK,
                        "play video"
                )
        );
    }
}

then to use it, you set the delegate with ViewCompat:

ViewCompat.setAccessibilityDelegate(playButton, new PlayVideoAccessibilityDelegate());

Using accessibilitools

Novoda has a utility library to help with accessibility on Android. This includes some tools to help set usage hints:

UsageHintsAccessibilityDelegate delegate = new UsageHintsAccessibilityDelegate(resources);  
delegate.setClickLabel("play video");

ViewCompat.setAccesibilityDelegate(playButton, delegate);

I wrote a blogpost which is an overview of accessibilitools (I am also a contributor to the library).

like image 104
ataulm Avatar answered Oct 23 '22 11:10

ataulm