| page.title=Touch Mode |
| parent.title=Articles |
| parent.link=../browser.html?tag=article |
| @jd:body |
| |
| <p>This article explains the <em>touch mode</em>, one of the most |
| important principles of Android's UI toolkit.</p> |
| |
| <p>The touch mode is a state of the view hierarchy that depends solely on the |
| user interaction with the phone. By itself, the touch mode is something very |
| easy to understand as it simply indicates whether the last user interaction was |
| performed with the touch screen. For example, if you are using an |
| Android-powered device, selecting a widget with the trackball will take you out |
| of touch mode; however, if you touch a button on the screen with your finger, |
| you will enter touch mode. When the user is not in touch mode, we talk about the |
| trackball mode, navigation mode or keyboard navigation, so do not be surprised |
| if you encounter these terms. </p> |
| |
| <p>There is only one API directly related to touch mode, |
| {@link android.view.View#isInTouchMode() View.isInTouchMode()}.</p> |
| |
| <p>Sounds easy enough, right? Oddly enough, touch mode is deceivingly simple and |
| the consequences of entering touch mode are far greater than you might |
| think. Let's look at some of the reasons why.</p> |
| |
| <h4>Touch Mode, Selection, and Focus</h4> |
| |
| <p>Designing a UI toolkit for mobile devices is difficult because of the various |
| interaction mechanisms they provide. Some devices offer only 12 keys, some have |
| a touch screen, some require a stylus, some have both a touch screen and a |
| keyboard. Based on the hardware capabilities of the he user can interact with |
| your application using different mechanisms, so we had to think very hard about |
| all the possible issues that could arise. One issue led us to create the touch |
| mode.</p> |
| |
| <p>Imagine a simple application, <a href="{@docRoot}resources/samples/index.html">ApiDemos</a> |
| for example, that shows a list of text items. The user can freely |
| navigate through the list using the trackball but also, alternatively, scroll |
| and fling the list using the touch screen. The issue in this scenario is |
| how to handle the selection properly when the user manipulates the list |
| through the touch screen. </p> |
| |
| <p>In this case, if the user selects an item at the top of the list and then |
| flings the list towards the bottom, what should happen to the selection? Should |
| it remain on the item and scroll off the screen? What should happen if the user |
| then decided to move the selection with the trackball? Or worse, what should |
| happen if the user presses the trackball to act upon the currently selected |
| item, which is not shown on screen anymore? </p> |
| |
| <p>After careful consideration, we decided to remove the selection altogether, |
| when the user manipulates the UI through the touch screen.</p> |
| |
| <p>In touch mode, there is no focus and no selection. Any selected item in a |
| list of in a grid becomes unselected as soon as the user enters touch |
| mode. Similarly, any focused widgets become unfocused when the user |
| enters touch mode. The image below illustrates what happens when the |
| user touches a list after selecting an item with the trackball.</p> |
| |
| <img style="margin: 0px 7px;" src="images/list02.png" alt="" id="BLOGGER_PHOTO_ID_5272753165743060962" border="0"> |
| <img style="margin: 0px 7px;" src="images/list01.png" alt="" id="BLOGGER_PHOTO_ID_5272753357441963442" border="0"> |
| |
| <p>To |
| make things more natural for the user, the framework knows how to |
| resurrect the selection/focus whenever the user leaves touch mode. For |
| instance, in the example above, if the user were to use the trackball |
| again, the selection would reappear on the previously-selected item. |
| This is why some developers are confused when they create a custom view |
| and start receiving key events only after moving the trackball once: |
| their application is in touch mode, and they need to use the trackball |
| to exit touch mode and resurrect the focus.</p> |
| |
| <p>The relationship between touch mode, selection, and focus means you must not |
| rely on selection and/or focus to exist in your application. A very common |
| problem with new Android developers is to rely on |
| {@link android.widget.AdapterView#getSelectedItemPosition() ListView.getSelectedItemPosition()}. |
| In touch mode, this method will return |
| {@link android.widget.AdapterView#INVALID_POSITION INVALID_POSITION}. |
| You should instead use click listeners (see |
| {@link android.widget.AdapterView#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)}) |
| or the choice mode (see |
| {@link android.widget.ListView#setChoiceMode(int)}).</p> |
| |
| <h4>Focusable in Touch Mode</h4> |
| |
| <p>In general, focus doesn't exist in touch mode. However, focus can exist in |
| touch mode in a very special way called <em>focusable</em>. This special mode |
| was created for widgets that receive text input, such as |
| {@link android.widget.EditText} or, when filtering is enabled, |
| {@link android.widget.ListView}. The focusable mode is what lets the user enter text |
| inside a text field on the screen, without first selecting it with the trackball |
| or their finger.</p> |
| |
| <p>When a user |
| touches the screen, the application will enter touch mode if it wasn't |
| in touch mode already. What happens during the transition to |
| touch mode depends on what the user touched, and what currently has |
| focus. If the user touches a widget that is focusable in touch |
| mode, that widget will receive focus. Otherwise, any currently |
| focused widget will not retain focus unless it is focusable in touch |
| mode. For instance, in the picture below, when the user touches |
| the screen, the input text field receives the focus.</p> |
| |
| <img style="margin: 0px 7px;" src="images/text_field.png" alt="" id="BLOGGER_PHOTO_ID_5272755475757779154" border="0"> |
| |
| <p>Fousable in touch mode (see |
| {@link android.view.View#setFocusableInTouchMode(boolean) View.setFocusableInTouchMode}) |
| is a property that you can set yourself, either from code or from XML. |
| However, you should use it sparingly and only in very specific situations, |
| because it breaks consistency with the normal behavior of the Android UI. A game |
| is a good example of an application that could make good use of the focusable in |
| touch mode property. MapView, if used in fullscreen as in Google Maps, is |
| another good example of where you can use focusable in touch mode correctly.</p> |
| |
| <p>Below is another example of a focusable in touch mode widget. When the user |
| taps an <code>AutoCompleteTextView</code> suggestion with his finger, the focus |
| remains on the input text field:</p> |
| |
| <img style="margin: 0px 7px;" src="images/search01.png" alt="" id="BLOGGER_PHOTO_ID_5272756689821626962" border="0"> |
| <img style="margin: 0px 7px;" src="images/search02.png" alt="" id="BLOGGER_PHOTO_ID_5272756246104676754" border="0"> |
| |
| <p>Developers new to Android often think that focusable in touch mode is the |
| solution they need to "fix" the problem of "disappearing" selection/focus. We |
| really encourage you to think very hard before using it. If used incorrectly, it |
| can make your application behave differently from the rest of the system and |
| simply throw off the user's habits. The Android framework contains all the tools |
| you need to handle user interactions without using focusable in touch mode. For |
| example, instead of trying to make <code>ListView</code> always keep its |
| selection, simply use the appropriate choice mode, as shown in |
| {@link android.widget.ListView#setChoiceMode(int)}. |
| |
| <h4>Touch Mode Cheat Sheet</h4> |
| |
| <p>Do:</p> |
| <ul> |
| <li>Remain consistent with the core applications</li><li>Use the appropriate feature if you need persistent selection (radio button, check box, the <code>ListView</code> choice mode, etc.)</li> |
| <li>Use focusable in touch mode if you write a game</li> |
| </ul> |
| |
| <p>Don't:</p> |
| <ul><li>Do not try to keep the focus or selection in touch mode</li></ul> |