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

后端 未结 1 789
悲哀的现实
悲哀的现实 2021-01-05 15:55

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 des

1条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-05 16:46

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

    0 讨论(0)
提交回复
热议问题