Pavan
Pavan

Reputation: 5136

Setting Button Role to the android MenuItem for Android Accessibility

I am working on the accessibility and currently I want to set the Button Role on the MenuItem. We have checked but not got the proper solution for the same. I tried by setting the custom action layout and then giving the custom action layout Button Role it detect it as button but click need to be handled by setting the click listener on action layout. Which I want to avoid, is there any possibility that we can set role to MenuItem. So it will announce like "Setting Button Double Tap To Activate"

`@JvmStatic
    fun View.setCustomRole(roleInfo: String) {
        ViewCompat.setAccessibilityDelegate(this,
            object : AccessibilityDelegateCompat() {
                override fun onInitializeAccessibilityNodeInfo(
                    v: View,
                    info: AccessibilityNodeInfoCompat
                ) {
                    super.onInitializeAccessibilityNodeInfo(v, info)
                    info.roleDescription = roleInfo
                }
            })
    }`

Tried above method by setting action layout which work but I need to change the click handling from app which I want to avoid.

Upvotes: 0

Views: 1373

Answers (1)

Quintin B
Quintin B

Reputation: 5881

This was answered fairly recently, however I think I can clean it up somewhat.

Option 1

You can make MenuItem's buttons by default by ensuring you have the latest material library imported.

implementation 'com.google.android.material:material:1.7.0'

The sample app I created for my answer was 1.5.0 and it still had the default "button" announcement.

Option 2


In Material 1.7.0:


Ensure that your MenuItem has an actionViewClass associated with it.

<item
    ...
    android:icon="ICON_REFERENCE"
    app:showAsAction="ifRoom"
    app:actionViewClass="android.widget.ImageButton"
    ...
/>

Bonus to option 2:

To be able to customize a11y attributes, you can then get the item and assign custom role descriptions or extra actions:

// inside onCreateOptionsMenu
val menuActionView = menu
    .findItem(R.id.action_settings)
    .actionView as ImageButton


ViewCompat.setAccessibilityDelegate(menuActionView, object: AccessibilityDelegateCompat() {
    override fun onInitializeAccessibilityNodeInfo(
        host: View?,
        info: AccessibilityNodeInfoCompat?
    ) {
        super.onInitializeAccessibilityNodeInfo(host, info)
        
        info?.apply {
            // not required as this is already a button
            // always use a built in class as this will be localized
            //     automatically for you
            // roleDescription = Button::class.java.simpleName 

            // I found I had to set this here, and not in the menu xml
            contentDescription = getString(R.string.action_settings)

            // to replace the term "activate" in "double tap to activate"
            // in production apps, use a localized string!
            addAction(
                AccessibilityNodeInfoCompat.AccessibilityActionCompat(
                    AccessibilityNodeInfoCompat.ACTION_CLICK, "Open menu"
                )
            )
        }
    }
})

Upvotes: 1

Related Questions