| page.title=Settings |
| page.tags=preferences,sharedpreferences |
| @jd:body |
| |
| <a class="notice-developers" href="{@docRoot}guide/topics/ui/settings.html"> |
| <div> |
| <h3>Developer Docs</h3> |
| <p>Settings</p> |
| </div> |
| </a> |
| |
| <p itemprop="description">Settings is a place in your app where users indicate their preferences for how your app should |
| behave. This benefits users because:</p> |
| |
| <ul> |
| <li>You don't need to interrupt them with the same questions over and over when certain situations |
| arise. The settings predetermine what will always happen in those situations (see design |
| principle: <a href="{@docRoot}design/get-started/principles.html#decide-for-me">Decide for me but |
| let me have the final say</a>).</li> |
| <li>You help them feel at home and in control (see design principle: |
| <a href="{@docRoot}design/get-started/principles.html#make-it-mine">Let me make it mine</a>).</li> |
| </ul> |
| |
| <h2 id="flow-structure">Flow and Structure</h2> |
| |
| <h4 id="settings-access">Provide access to Settings in the action overflow</h4> |
| |
| <p>Settings is given low prominence in the UI because it's not frequently needed. Even if there's |
| room in the <a href="{@docRoot}design/patterns/actionbar.html">action bar</a>, never make Settings |
| an action button. Always keep it in the action overflow and label it "Settings". Place it below |
| all other items except "Help".</p> |
| |
| <img src="{@docRoot}design/media/settings_overflow.png"> |
| |
| <div class="vspace size-2"> </div> |
| |
| <h4 id="what-to-make-a-setting">Avoid the temptation to make everything a setting</h4> |
| |
| <p>Because Settings is a few navigational steps away, no matter how many items you have, they'll |
| never clutter up the core part of your UI. This may seem like good news, but it also poses a |
| challenge.</p> |
| |
| <p>Settings can be a tempting place to keep a lot of stuff—like a hall closet where things |
| get stashed when you tidy up before company comes over. It's not a place where you spend lots of |
| time, so it's easy to rationalize and ignore its cluttered condition. But when users visit |
| Settings—however infrequently—they'll have the same expectations for the experience as |
| they do everywhere else in your app. More settings means more choices to make, and too many are |
| overwhelming.</p> |
| |
| <p>So don't punt on the difficult product decisions and debates that can bring on the urge to |
| "just make it a setting". For each control you're considering adding to Settings, make sure it |
| meets the bar:</p> |
| |
| <img src="{@docRoot}design/media/settings_flowchart.png"> |
| |
| <div class="vspace size-3"> </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-5 with-callouts"> |
| |
| <h4 id="group-settings">If you still have lots of settings, group related settings together</h4> |
| |
| <p>The number of items an average human can hold in short-term memory is 7±2. If you |
| present a list of 10 or more settings (even after applying the criteria above), users will have |
| more difficulty scanning, comprehending, and processing them.</p> |
| |
| <p>You can remedy this by dividing some or all of the settings into groups, effectively turning |
| one long list into multiple shorter lists. A group of related settings can be presented in one of |
| two ways:</p> |
| |
| <ol> |
| <li><h4>Under a section divider</h4></li> |
| <li><h4>In a separate subscreen</h4></li> |
| </ol> |
| |
| <p>You can use one or both these grouping techniques to organize your app's settings.</p> |
| |
| <p>For example, in the main screen of the Android Settings app, each item in the list navigates |
| to a subscreen of related settings. In addition, the items themselves are grouped under section |
| dividers.</p> |
| |
| </div> |
| <div class="layout-content-col span-8"> |
| |
| <img src="{@docRoot}design/media/settings_grouping.png"> |
| |
| </div> |
| </div> |
| |
| <p>Grouping settings is not an exact science, but here's some advice for how to approach it, based |
| on the total number of settings in your app.</p> |
| |
| <div class="vspace size-1"> </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-2"> |
| |
| <h4>7 or fewer</h4> |
| |
| </div> |
| <div class="layout-content-col span-11"> |
| |
| <p>Don't group them at all. It won't benefit users and will seem like overkill.</p> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-2"> |
| |
| <h4>8 to 10</h4> |
| |
| </div> |
| <div class="layout-content-col span-11"> |
| |
| <p>Try grouping related settings under 1 or 2 section dividers. If you have any "singletons" |
| (settings that don't relate to any other settings and can't be grouped under your section |
| dividers), treat them as follows:</p> |
| |
| <ul> |
| <li>If they include some of your most important settings, list them at the top without a section |
| divider.</li> |
| <li>Otherwise, list them at the bottom with a section divider called "OTHER", in order of |
| importance.</li> |
| </ul> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-2"> |
| |
| <h4>11 to 15</h4> |
| |
| </div> |
| <div class="layout-content-col span-11"> |
| |
| <p>Same advice as above, but try 2 to 4 section dividers.</p> |
| |
| <p>Also, try the following to reduce the list:</p> |
| |
| <ul> |
| <li>If 2 or more of the settings are mainly for power users, move them out of your main Settings |
| screen and into an "Advanced" subscreen. Place an item in the action overflow called "Advanced" to |
| navigate to it.</li> |
| <li>Look for "doubles": two settings that relate to one another, but not to any other settings. |
| Try to combine them into one setting, using the design patterns described later in this section. |
| For example, you might be able to redesign two related checkbox settings into one multiple choice |
| setting.</li> |
| </ul> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-2"> |
| |
| <h4>16 or more</h4> |
| |
| </div> |
| <div class="layout-content-col span-11"> |
| |
| <p>If you have any instances of 4 or more related settings, group them under a subscreen. Then use |
| the advice suggested above for the reduced list size.</p> |
| |
| </div> |
| </div> |
| |
| |
| <h2 id="patterns">Design Patterns</h2> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Checkbox</h4> |
| <p>Use this pattern for a setting that is either selected or not selected.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_checkbox.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Multiple choice</h4> |
| <p>Use this pattern for a setting that needs to present a discrete set of options, from which the |
| user can choose only one.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_multiple_choice.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Slider</h4> |
| <p>Use this pattern for a setting where the range of values are not discrete and fall along a |
| continuum.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_slider.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Date/time</h4> |
| <p>Use this pattern for a setting that needs to collect a date and/or time from the user.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_date_time.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Subscreen navigation</h4> |
| <p>Use this pattern for navigating to a subscreen or sequence of subscreens that guide the user |
| through a more complex setup process.</p> |
| <ul> |
| <li>If navigating to a single subscreen, use the same title in both the subscreen and the label |
| navigating to it.</li> |
| <li>If navigating to a sequence of subscreens (as in this example), use a title that describes the |
| first step in the sequence.</li> |
| </ul> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_subscreen_navigation.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>List subscreen</h4> |
| <p>Use this pattern for a setting or category of settings that contains a list of equivalent items. |
| </p> |
| <p>The label provides the name of the item, and secondary text may be used for status. (In this |
| example, status is reinforced with an icon to the right of the label.) Any actions associated with |
| the list appear in the action bar rather than the list itself.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_list_subscreen.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Master on/off switch</h4> |
| <p>Use this pattern for a category of settings that need a mechanism for turning on or off as a |
| whole.</p> |
| <p>An on/off switch is placed as the first item in the action bar of a subscreen. When the switch |
| is turned off, the items in the list disappear, replaced by text that describes why the list is |
| empty. If any actions require the switch to be on, they become disabled.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_master_on_off.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <div class="vspace size-2"> </div> |
| |
| <p>You can also echo the master on/off switch in the menu item that leads to the subscreen. |
| However, you should only do this in cases where users rarely need to access the subscreen once |
| it's initially set up and more often just want to toggle the switch.</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_master_on_off_2.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Individual on/off switch</h4> |
| <p>Use this pattern for an individual setting that requires a more elaborate description than can |
| be provided in checkbox form.</p> |
| <p>The on/off switch only appears in the subscreen so that users aren't able to toggle it without |
| also being exposed to the descriptive text. Secondary text appears below the setting label to |
| reflect the current selection.</p> |
| <p>In this example, Android Beam is on by default. Since users might not know what this setting |
| does, we made the status more descriptive than just "On".</p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_individual_on_off.png"> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-3"> |
| |
| <h4>Dependency</h4> |
| <p>Use this pattern for a setting that changes availability based on the value of another setting. |
| </p> |
| <p>The disabled setting appears below its dependency, without any indentation. If the setting |
| includes a status line, it says "Unavailable", and if the reason isn't obvious, a brief |
| explanation is included in the status.</p> |
| <p>If a given setting is a dependency to 3 or more settings, consider using a subscreen with a |
| master on/off switch so that your main settings screen isn't cluttered by lots of disabled items. |
| </p> |
| |
| </div> |
| <div class="layout-content-col span-10"> |
| |
| <img src="{@docRoot}design/media/settings_dependency.png"> |
| |
| </div> |
| </div> |
| |
| <h2 id="defaults">Defaults</h2> |
| |
| <p>Take great care in choosing default values for each of your settings. Because settings |
| determine app behavior, your choices will contribute to users' first impressions of your app. Even |
| though users can change settings, they'll expect the initial states to be sensible. The following |
| questions (when applicable) may help inform your decisions:</p> |
| |
| <ul> |
| <li>Which choice would most users be likely to choose on their own if there were no default?</li> |
| <li>Which choice is the most neutral or middle-of-the-road?</li> |
| <li>Which choice is the least risky, controversial, or over-the-top?</li> |
| <li>Which choice uses the least amount of battery or mobile data?</li> |
| <li>Which choice best supports the design principle |
| <a href="{@docRoot}design/get-started/principles.html#never-lose-my-stuff">Never lose my stuff</a>?</li> |
| <li>Which choice best supports the design principle |
| <a href="{@docRoot}design/get-started/principles.html#interrupt-only-if-important">Only interrupt |
| me if it's important</a>? |
| </li> |
| </ul> |
| |
| <h2 id="writing">Writing Guidelines</h2> |
| |
| <h4>Label clearly and concisely</h4> |
| |
| <p>Writing a good label for a setting can be challenging because space is very limited. You only |
| get one line, and it's incredibly short on the smallest of devices. Follow these guidelines to |
| make your labels brief, meaningful, and scannable:</p> |
| |
| <ul> |
| <li>Write each label in sentence case (i.e. only the first word and proper nouns are capitalized). |
| </li> |
| <li>Don't start a label with an instructional verb like "Set", "Change", "Edit", "Modify", |
| "Manage", "Use", "Select", or "Choose". Users already understand that they can do these things to |
| settings.</li> |
| <li>Likewise, don't end a label with a word like "setting" or "settings". It's already implied. |
| </li> |
| <li>If the setting is part of a grouping, don't repeat the word(s) used in the section divider or |
| subscreen title.</li> |
| <li>Avoid starting a label with a negative word like "Don't" or "Never". For example, "Don't |
| allow" could be rephrased to "Block".</li> |
| <li>Steer clear of technical jargon as much as possible, unless it's a term widely understood by |
| your target users. Use common verbs and nouns to convey the setting's purpose rather than its |
| underlying technology.</li> |
| <li>Don't refer to the user. For example, for a setting allowing the user to turn notifications on |
| or off, label it "Notifications" instead of "Notify me".</li> |
| </ul> |
| |
| <p>Once you've decided on labels for your settings, be sure to preview them on an |
| <a href="{@docRoot}design/style/metrics-grids.html">LDPI handset</a> in portrait to make sure |
| they'll fit everywhere.</p> |
| |
| <h4>Secondary text below is for status, not description…</h4> |
| |
| <p>Before Ice Cream Sandwich, we often displayed secondary text below a label to further describe |
| it or provide instructions. Starting in Ice Cream Sandwich, we're using secondary text for status. |
| </p> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label bad emulate-content-left-padding">Before</div> |
| |
| <table class="ui-table bad emulate-content-left-padding"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Screen timeout |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| Adjust the delay before the screen automatically turns off |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label good">After</div> |
| |
| <table class="ui-table good"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Sleep |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| After 10 minutes of inactivity |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| </div> |
| |
| <p>Status in secondary text has the following benefits:</p> |
| <ul> |
| <li>Users can see at a glance what the current value of a setting is without having to navigate |
| any further.</li> |
| <li>It applies the design principle |
| <a href="{@docRoot}design/get-started/principles.html#keep-it-brief">Keep it brief</a>, which |
| users greatly appreciate.</li> |
| </ul> |
| |
| <h4>…unless it's a checkbox setting</h4> |
| <p>There's one important exception to the using secondary text for status: checkbox settings. |
| Here, use secondary text for description, not status. Status below a checkbox is unnecessary |
| because the checkbox already indicates it. The reason why it's appropriate to have a description |
| below a checkbox setting is because—unlike other controls—it doesn't display a dialog |
| or navigate to another screen where additional information can be provided.</p> |
| |
| <p>That said, if a checkbox setting's label is clear enough on its own, there's no need to also |
| provide a description. Only include one if necessary.</p> |
| |
| <p>Follow these guidelines to write checkbox setting descriptions:</p> |
| <ul> |
| <li>Keep it to one sentence and don't use ending punctuation.</li> |
| <li>Convey what happens when the setting is checked, phrased in the form of a command. Example: |
| "Allow data exchange", not "Allows data exchange".</li> |
| <li>Avoid repetition by choosing words that don't already appear in the label.</li> |
| <li>Don't refer to the user unless it's necessary for understanding the setting.</li> |
| <li>If you must refer to the user, do so in the second person ("you") rather than the first person |
| ("I"). Android speaks to users, not on behalf of them.</li> |
| </ul> |
| |
| <h4>Writing examples</h4> |
| |
| <p>The following are examples of changes we made to labels and secondary text in the Settings app |
| in Ice Cream Sandwich.</p> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label bad emulate-content-left-padding">Before</div> |
| |
| <table class="ui-table bad emulate-content-left-padding"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Use tactile feedback |
| </th> |
| </tr> |
| </thead> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label good">After</div> |
| |
| <table class="ui-table good"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Vibrate on touch |
| </th> |
| </tr> |
| </thead> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-5"> |
| |
| <p>In this checkbox setting, we eliminated the throwaway word "Use" and rephrased the label to be |
| more direct and understandable.</p> |
| |
| </div> |
| |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label bad emulate-content-left-padding">Before</div> |
| |
| <table class="ui-table bad emulate-content-left-padding"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Screen timeout |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| Adjust the delay before the screen automatically turns off |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label good">After</div> |
| |
| <table class="ui-table good"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Sleep |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| After 10 minutes of inactivity |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-5"> |
| |
| <p>In this multiple choice setting, we changed the label to a friendlier term and also replaced |
| the description with status. We put some descriptive words around the selected value, "10 |
| minutes", because on its own, the meaning could be misinterpreted as "sleep for 10 minutes".</p> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label bad emulate-content-left-padding">Before</div> |
| |
| <table class="ui-table bad emulate-content-left-padding"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Change screen lock |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| Change or disable pattern, PIN, or password security |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label good">After</div> |
| |
| <table class="ui-table good"> |
| <thead> |
| <tr> |
| <th class="label"> |
| Screen lock |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| Pattern |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-5"> |
| |
| <p>This setting navigates to a a sequence of subscreens that allow users to choose a type of |
| screen lock and then set it up. We eliminated the throwaway word "Change" in the label, and |
| replaced the description with the current type of screen lock set up by the user. If the user |
| hasn't set up a screen lock, the secondary text says "None".</p> |
| |
| </div> |
| </div> |
| |
| <div class="layout-content-row"> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label bad emulate-content-left-padding">Before</div> |
| |
| <table class="ui-table bad emulate-content-left-padding"> |
| <thead> |
| <tr> |
| <th class="label"> |
| NFC |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| Use Near Field Communication to read and exchange tags |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-4"> |
| |
| <div class="do-dont-label good">After</div> |
| |
| <table class="ui-table good"> |
| <thead> |
| <tr> |
| <th class="label"> |
| NFC |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="secondary-text"> |
| Allow data exchange when the phone touches another device |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| </div> |
| <div class="layout-content-col span-5"> |
| |
| <p>In this checkbox setting—although it's technical jargon—we kept the "NFC" label |
| because: (1) we couldn't find a clear, concise alternative, and (2) user familiarity with the |
| acronym is expected to increase dramatically in the next couple of years.</p> |
| <p>We did, however, rewrite the description. It's far less technical than before and does a better |
| job of conveying how and why you'd use NFC. We didn't include what the acronym stands for because |
| it doesn't mean anything to most users and would have taken up a lot of space.</p> |
| |
| </div> |
| </div> |
| |
| |
| |
| <h2 id="checklist">Checklist</h2> |
| <ul> |
| <li><p>Make sure each item in Settings meets the criteria for belonging there.</p></li> |
| <li><p>If you have more than 7 items, explore ways to group related settings.</p></li> |
| <li><p>Use design patterns wherever applicable so users don't face a learning curve.</p></li> |
| <li><p>Choose defaults that are safe, neutral, and fit the majority of users.</p></li> |
| <li><p>Give each setting a clear, concise label and use secondary text appropriately.</p></li> |
| </ul> |