| page.title=Developing Accessible Applications | |
| parent.title=Implementing Accessibility | |
| parent.link=index.html | |
| trainingnavtop=true | |
| next.title=Developing an Accessibility Service | |
| next.link=service.html | |
| @jd:body | |
| <div id="tb-wrapper"> | |
| <div id="tb"> | |
| <h2>This lesson teaches you to</h2> | |
| <ol> | |
| <li><a href="#contentdesc">Add Content Descriptions</a></li> | |
| <li><a href="#focus">Design for Focus Navigation</a></li> | |
| <li><a href="#events">Fire Accessibility Events</a></li> | |
| <li><a href="#testing">Test Your Application</a></li> | |
| </ol> | |
| <!-- other docs (NOT javadocs) --> | |
| <h2>You should also read</h2> | |
| <ul> | |
| <li><a href="{@docRoot}guide/topics/ui/accessibility/apps.html">Making | |
| Applications Accessible</a></li> | |
| </ul> | |
| </div> | |
| </div> | |
| <p>Android has several accessibility-focused features baked into the platform, | |
| which make it easy to optimize your application for those with visual or | |
| physical disabilities. However, it's not always obvious what the correct | |
| optimizations are, or the easiest way to leverage the framework toward this | |
| purpose. This lesson shows you how to implement the strategies and platform | |
| features that make for a great accessibility-enabled Android application.</p> | |
| <h2 id="contentdesc">Add Content Descriptions</h2> | |
| <p>A well-designed user interface (UI) often has elements that don't require an explicit | |
| label to indicate their purpose to the user. A checkbox next to an item in a | |
| task list application has a fairly obvious purpose, as does a trash can in a file | |
| manager application. However, to your users with vision impairment, other UI | |
| cues are needed.</p> | |
| <p>Fortunately, it's easy to add labels to UI elements in your application that | |
| can be read out loud to your user by a speech-based accessibility service like <a | |
| href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">TalkBack</a> | |
| . | |
| If you have a label that's likely not to change during the lifecycle of the | |
| application (such as "Pause" or "Purchase"), you can add it via the XML layout, | |
| by setting a UI element's <a | |
| href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription" | |
| >{@code android:contentDescription}</a> attribute, like in this | |
| example:</p> | |
| <pre> | |
| <Button | |
| android:id=”@+id/pause_button” | |
| android:src=”@drawable/pause” | |
| android:contentDescription=”@string/pause”/> | |
| </pre> | |
| <p>However, there are plenty of situations where it's desirable to base the content | |
| description on some context, such as the state of a toggle button, or a piece | |
| selectable data like a list item. To edit the content description at runtime, | |
| use the {@link android.view.View#setContentDescription(CharSequence) | |
| setContentDescription()} method, like this:</p> | |
| <pre> | |
| String contentDescription = "Select " + strValues[position]; | |
| label.setContentDescription(contentDescription); | |
| </pre> | |
| <p>This addition to your code is the simplest accessibility improvement you can make to your | |
| application, but one of the most useful. Try to add content descriptions | |
| wherever there's useful information, but avoid the web-developer pitfall of | |
| labelling <em>everything</em> with useless information. For instance, don't set | |
| an application icon's content description to "app icon". That just increases | |
| the noise a user needs to navigate in order to pull useful information from your | |
| interface.</p> | |
| <p>Try it out! Download <a | |
| href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">TalkBack</a> | |
| (an accessibility service published by Google) and enable it in <strong>Settings | |
| > Accessibility > TalkBack</strong>. Then navigate around your own | |
| application and listen for the audible cues provided by TalkBack.</p> | |
| <h2 id="focus">Design for Focus Navigation</h2> | |
| <p>Your application should support more methods of navigation than the | |
| touch screen alone. Many Android devices come with navigation hardware other | |
| than the touchscreen, like a D-Pad, arrow keys, or a trackball. In addition, | |
| later Android releases also support connecting external devices like keyboards | |
| via USB or bluetooth.</p> | |
| <p>In order to enable this form of navigation, all navigational elements that | |
| the user should be able to navigate to need to be set as focusable. This | |
| modification can be | |
| done at runtime using the | |
| {@link android.view.View#setFocusable View.setFocusable()} method on that UI | |
| control, or by setting the <a | |
| href="{@docRoot}reference/android/view/View.html#attr_android:focusable">{@code | |
| android:focusable}</a> | |
| attrubute in your XML layout files.</p> | |
| <p>Also, each UI control has 4 attributes, | |
| <a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusUp">{@code | |
| android:nextFocusUp}</a>, | |
| <a | |
| href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusDown">{@code | |
| android:nextFocusDown}</a>, | |
| <a | |
| href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusLeft">{@code | |
| android:nextFocusLeft}</a>, | |
| and <a | |
| href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusRight">{@code | |
| android:nextFocusRight}</a>, | |
| which you can use to designate | |
| the next view to receive focus when the user navigates in that direction. While | |
| the platform determines navigation sequences automatically based on layout | |
| proximity, you can use these attributes to override that sequence if it isn't | |
| appropriate in your application. </p> | |
| <p>For instance, here's how you represent a button and label, both | |
| focusable, such that pressing down takes you from the button to the text view, and | |
| pressing up would take you back to the button.</p> | |
| <pre> | |
| <Button android:id="@+id/doSomething" | |
| android:focusable="true" | |
| android:nextFocusDown=”@id/label” | |
| ... /> | |
| <TextView android:id="@+id/label" | |
| android:focusable=”true” | |
| android:text="@string/labelText" | |
| android:nextFocusUp=”@id/doSomething” | |
| ... /> | |
| </pre> | |
| <p>Verify that your application works intuitively in these situations. The | |
| easiest way is to simply run your application in the Android emulator, and | |
| navigate around the UI with the emulator's arrow keys, using the OK button as a | |
| replacement for touch to select UI controls.</p> | |
| <h2 id="events">Fire Accessibility Events</h2> | |
| <p>If you're using the view components in the Android framework, an | |
| {@link android.view.accessibility.AccessibilityEvent} is created whenever you | |
| select an item or change focus in your UI. These events are examined by the | |
| accessibility service, enabling it to provide features like text-to-speech to | |
| the user.</p> | |
| <p>If you write a custom view, make sure it fires events at the appropriate | |
| times. Generate events by calling {@link | |
| android.view.View#sendAccessibilityEvent(int)}, with a parameter representing | |
| the type of event that occurred. A complete list of the event types currently | |
| supported can be found in the {@link | |
| android.view.accessibility.AccessibilityEvent} reference documentation. | |
| <p>As an example, if you want to extend an image view such that you can write | |
| captions by typing on the keyboard when it has focus, it makes sense to fire an | |
| {@link android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_CHANGED} | |
| event, even though that's not normally built into image views. The code to | |
| generate that event would look like this:</p> | |
| <pre> | |
| public void onTextChanged(String before, String after) { | |
| ... | |
| if (AccessibilityManager.getInstance(mContext).isEnabled()) { | |
| sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); | |
| } | |
| ... | |
| } | |
| </pre> | |
| <h2 id="testing">Test Your Application</h2> | |
| <p>Be sure to test the accessibility functionality as you add it to your | |
| application. In order to test the content descriptions and Accessibility | |
| events, install and enable an accessibility service. One option is <a | |
| href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">Talkback</a> | |
| , | |
| a free, open source screen reader available on Google Play. With the service | |
| enabled, test all the navigation flows through your application and listen to | |
| the spoken feedback.</p> | |
| <p>Also, attempt to navigate your application using a directional controller, | |
| instead of the touch screen. You can use a physical device with a d-pad or | |
| trackball if one is available. If not, use the Android emulator and it's | |
| simulated keyboard controls.</p> | |
| <p>Between the service providing feedback and the directional navigation through | |
| your application, you should get a sense of what your application is like to | |
| navigate without any visual cues. Fix problem areas as they appear, and you'll | |
| end up with with a more accessible Android application.</p> |