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"
Yes, this is absolutely possible!
onInitializeAccessibilityNodeInfo
methodIf 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
!
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());
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With