Download - Android Accessibility - The missing manual
![Page 1: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/1.jpg)
Android AccessibilityThe Missing Manual
Ted Drake, Intuit Accessibility
![Page 2: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/2.jpg)
Testing
![Page 3: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/3.jpg)
Android Lint
![Page 4: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/4.jpg)
AccessibilityChecks
• AccessibilityChecks released at Google IO 2015
• Open Source tests for Espresso and Robolectric
• Soon: Android app that lets you test on a device
• Goal: Adopt AccessibilityChecks for Appium
![Page 5: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/5.jpg)
TalkBack
![Page 6: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/6.jpg)
Turn on TalkBack
![Page 7: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/7.jpg)
Gestures
![Page 8: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/8.jpg)
Two Fingered Gestures
![Page 9: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/9.jpg)
Android Accessibility Shortcut
![Page 10: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/10.jpg)
Programming
![Page 11: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/11.jpg)
accessibilityLiveRegion
• Based on the Live Region experience in HTML + ARIA
• Content is announced when it changes or appears on screen
• android:accessibilityLiveRegion =“polite”
![Page 12: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/12.jpg)
![Page 13: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/13.jpg)
AccessibilityAction
• Swipes and other hard to discover actions
• Actions are activated from the Local Context Menu
• Provide hints for actions
![Page 14: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/14.jpg)
Create AccessibilityAction/** * @param actionId The id for this action. This should either be one of * the standard actions or a specific action for your app. In that case it * is required to use a resource identifier. */public AccessibilityAction(int id, CharSequence label) new AccessibilityAction(R.id.dismiss, getString(R.string.dismiss));new AccessibilityAction(ACTION_CLICK, getString(R.string.play_song)); !// Constants for all the standard actions with default label: AccessibilityAction.ACTION_CLICK
![Page 15: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/15.jpg)
Handling a Custom ActioneventView.setAccessibilityDelegate(new AccessibilityDelegate { @Override public onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.addAction(new AccessibilityAction(R.id.dismiss,}@OverridegetString(R.string.dismiss))); public boolean performAccessibilityAction(View host, int action, Bundle args) { if (action == R.id.dismiss) {} // Logic for action }});
![Page 16: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/16.jpg)
android:importantForAccessibility
noHideDescendants
noHideDescendants
noHideDescendants
auto
![Page 17: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/17.jpg)
ListPopupWindow
setModal(true)
![Page 18: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/18.jpg)
Forms
![Page 19: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/19.jpg)
Form Labels
Which is correct? • android:hint
• android:labelFor
• android:contentDescription
![Page 20: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/20.jpg)
![Page 21: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/21.jpg)
<TextView
android:layout_height="match_parent"
android:labelFor="@+id/edit_item_name"
android:text=“Invoice amount"/>
<EditText
android:id="@+id/edit_item_name"
android:layout_height="wrap_content"
android:hint=“Invoice Amount"/>
![Page 22: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/22.jpg)
android:hint
![Page 23: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/23.jpg)
android:hint
• This create a placeholder text string within an input
• This was the preferred method and is a hack
• The hint is removed when a user adds a value to the input
• Still a valid method of adding a label to an input
![Page 24: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/24.jpg)
contentDescription
• Invisible description for TalkBack
• Should not be used directly on an input
• You can use it on an input’s container and combine with labelFor
![Page 25: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/25.jpg)
textinputlayout<textinputlayout
android:labelfor="@id/signupemail"
android:contentdescription="Email"
android:accessibilityliveregion="polite">
<edittext
android:id="@id/signupemail"
android:hint="Email"
android:seterror="Create a valid email address"…/>
</textinputlayout>
![Page 26: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/26.jpg)
Checking for TalkBackAccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE);
boolean isAccessibilityEnabled = am.isEnabled();
boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled();
![Page 27: Android Accessibility - The missing manual](https://reader034.vdocument.in/reader034/viewer/2022052116/587d539c1a28abee158b51a5/html5/thumbnails/27.jpg)
Android Documentation• Creating an Accessible App
• Developing an Accessible Service
• Android Fragments
• Android Properties and TalkBack
• Robolectric + Espresso
• Android Accessibility Design
• Accessibility Checks