From c8a6f8a0414d9366bd2d3ee9d74271c8f680409b Mon Sep 17 00:00:00 2001 From: Scott Main Date: Wed, 5 Dec 2012 16:13:25 -0800 Subject: [PATCH] docs: add class on keyboards Change-Id: I3fb179457af50eec9d111f84eb9fabf49bc7ab1b --- docs/html/guide/topics/ui/controls/text.jd | 46 ++++- .../images/training/input/ime_autocorrect.png | Bin 0 -> 35944 bytes .../images/training/input/ime_password.png | Bin 0 -> 27363 bytes docs/html/training/best-user-input.jd | 9 + docs/html/training/keyboard-input/commands.jd | 113 ++++++++++++ docs/html/training/keyboard-input/index.jd | 54 ++++++ .../training/keyboard-input/navigation.jd | 166 +++++++++++++++++ docs/html/training/keyboard-input/style.jd | 171 ++++++++++++++++++ .../training/keyboard-input/visibility.jd | 133 ++++++++++++++ docs/html/training/training_toc.cs | 38 +++- 10 files changed, 717 insertions(+), 13 deletions(-) create mode 100644 docs/html/images/training/input/ime_autocorrect.png create mode 100644 docs/html/images/training/input/ime_password.png create mode 100644 docs/html/training/best-user-input.jd create mode 100644 docs/html/training/keyboard-input/commands.jd create mode 100644 docs/html/training/keyboard-input/index.jd create mode 100644 docs/html/training/keyboard-input/navigation.jd create mode 100644 docs/html/training/keyboard-input/style.jd create mode 100644 docs/html/training/keyboard-input/visibility.jd diff --git a/docs/html/guide/topics/ui/controls/text.jd b/docs/html/guide/topics/ui/controls/text.jd index 2d9d2158f1add..654883dc85a21 100644 --- a/docs/html/guide/topics/ui/controls/text.jd +++ b/docs/html/guide/topics/ui/controls/text.jd @@ -79,15 +79,23 @@ should use the {@code textEmailAddress} input type:

-

There are several different input types available for different situations. You can find -them all listed with the documentation for {@code -android:inputType}.

+

There are several different input types available for different situations. +Here are some of the more common values for +{@code android:inputType}:

-

Tip: To allow users to input long strings of text with line -breaks, use the {@code "textMultiLine"} input type. By default, an {@link android.widget.EditText} -object is restricted to one line of text and scrolls horizontally when the text exceeds the -available width.

+
+
{@code "text"}
+
Normal text keyboard.
+
{@code "textEmailAddress"}
+
Normal text keyboard with the @ character.
+
{@code "textUri"}
+
Normal text keyboard with the / character.
+
{@code "number"}
+
Basic number keypad.
+
{@code "phone"}
+
Phone-style keypad.
+

Controlling other behaviors

@@ -98,7 +106,25 @@ capitalize all new words or use features like auto-complete and spelling suggest

The {@code android:inputType} attribute allows bitwise combinations so you can specify both a keyboard -layout and one or more behaviors at once. For example, here's how you can collect a postal +layout and one or more behaviors at once.

+ +

Here are some of the common input type values that define keyboard behaviors:

+ +
+
{@code "textCapSentences"}
+
Normal text keyboard that capitalizes the first letter for each new sentence.
+
{@code "textCapWords"}
+
Normal text keyboard that capitalizes every word. Good for titles or person names.
+
{@code "textAutoCorrect"}
+
Normal text keyboard that corrects commonly misspelled words.
+
{@code "textPassword"}
+
Normal text keyboard, but the characters entered turn into dots.
+
{@code "textMultiLine"}
+
Normal text keyboard that allow users to input long strings of text that include line +breaks (carriage returns).
+
+ +

For example, here's how you can collect a postal address, capitalize each word, and disable text suggestions:

@@ -177,7 +203,7 @@ editText.setOnEditorActionListener(new OnEditorActionListener() {
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         boolean handled = false;
         if (actionId == EditorInfo.IME_ACTION_SEND) {
-            // Send the user message
+            sendMessage();
             handled = true;
         }
         return handled;
diff --git a/docs/html/images/training/input/ime_autocorrect.png b/docs/html/images/training/input/ime_autocorrect.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd8371bdcd0f49a321672ee3967a0e56930f8242
GIT binary patch
literal 35944
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℞;x-i%2dQsj};JrEe`6~kvOOGVv7L9!#Bm#uVN%O
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 classes cover various subjects of user input, such as
+touch screen gestures and text input through on-screen input methods and hardware keyboards.

\ No newline at end of file diff --git a/docs/html/training/keyboard-input/commands.jd b/docs/html/training/keyboard-input/commands.jd new file mode 100644 index 0000000000000..9d2de41b86935 --- /dev/null +++ b/docs/html/training/keyboard-input/commands.jd @@ -0,0 +1,113 @@ +page.title=Handling Keyboard Actions + +trainingnavtop=true + +@jd:body + +
+ + +

When the user gives focus to an editable text view such as an {@link android.widget.EditText} +element and the user has a hardware keyboard attached, all +input is handled by the system. If, however, you'd like to intercept +or directly handle the keyboard input yourself, you can do so by implementing callback methods +from the {@link android.view.KeyEvent.Callback} interface, such as {@link +android.view.KeyEvent.Callback#onKeyDown onKeyDown()} and {@link +android.view.KeyEvent.Callback#onKeyMultiple onKeyMultiple()}.

+ +

Both the {@link +android.app.Activity} and {@link android.view.View} class implement the +{@link android.view.KeyEvent.Callback} interface, so you +should generally override the callback methods in your extension of these classes as +appropriate.

+ +

Note: When handling keyboard events with the {@link +android.view.KeyEvent} class and related APIs, you should expect that such keyboard +events come only from a hardware keyboard. You should never rely on receiving key events +for any key on a soft input method (an on-screen keyboard).

+ + +

Handle Single Key Events

+ +

To handle an individual key press, implement {@link +android.app.Activity#onKeyDown onKeyDown()} or {@link +android.app.Activity#onKeyUp onKeyUp()} as appropriate. Usually, you should +use {@link android.app.Activity#onKeyUp onKeyUp()} if you want to be sure that you receive +only one event. If the user presses and holds the button, then {@link +android.app.Activity#onKeyDown onKeyDown()} is called multiple times.

+ +

For example, this implementation responds to some keyboard keys to control a game:

+ +
+@Override
+public boolean onKeyUp(int keyCode, KeyEvent event) {
+    switch (keyCode) {
+        case KeyEvent.KEYCODE_D:
+            moveShip(MOVE_LEFT);
+            return true;
+        case KeyEvent.KEYCODE_F:
+            moveShip(MOVE_RIGHT);
+            return true;
+        case KeyEvent.KEYCODE_J:
+            fireMachineGun();
+            return true;
+        case KeyEvent.KEYCODE_K:
+            fireMissile();
+            return true;
+        default:
+            return super.onKeyUp(keyCode, event);
+    }
+}
+
+ + +

Handle Modifier Keys

+ +

To respond to modifier key events such as when a key is combined with Shift or Control, you can +query the {@link android.view.KeyEvent} that's passed to the callback method. Several methods +provide information about modifier keys such as {@link android.view.KeyEvent#getModifiers()} +and {@link android.view.KeyEvent#getMetaState()}. However, the simplest solution is to check whether +the exact modifier key you care about is being pressed with methods such as +{@link android.view.KeyEvent#isShiftPressed()} and {@link android.view.KeyEvent#isCtrlPressed()}. +

+ +

For example, here's the {@link android.app.Activity#onKeyDown onKeyDown()} implementation +again, with some extra handling for when the Shift key is held down with one of the keys:

+ +
+@Override
+public boolean onKeyUp(int keyCode, KeyEvent event) {
+    switch (keyCode) {
+        ...
+        case KeyEvent.KEYCODE_J:
+            if (event.isShiftPressed()) {
+                fireLaser();
+            } else {
+                fireMachineGun();
+            }
+            return true;
+        case KeyEvent.KEYCODE_K:
+            if (event.isShiftPressed()) {
+                fireSeekingMissle();
+            } else {
+                fireMissile();
+            }
+            return true;
+        default:
+            return super.onKeyUp(keyCode, event);
+    }
+}
+
+ + + diff --git a/docs/html/training/keyboard-input/index.jd b/docs/html/training/keyboard-input/index.jd new file mode 100644 index 0000000000000..ba4e5983401f5 --- /dev/null +++ b/docs/html/training/keyboard-input/index.jd @@ -0,0 +1,54 @@ +page.title=Handling Keyboard Input + +trainingnavtop=true +startpage=true + +@jd:body + +
+
+ + +

Dependencies and prerequisites

+
    +
  • Android 1.6 (API Level 3) or higher
  • +
+ +
+
+ +

The Android system shows an on-screen keyboard—known as a +soft input method—when a text field in your UI receives focus. +To provide the best user experience, you can specify characteristics +about the type of input you expect (such as +whether it's a phone number or email address) and how the input method should behave (such as +whether it performs auto-correct for spelling mistakes).

+ +

In addition to the on-screen input methods, Android also supports hardware keyboards, so it's +important that your app optimize its user experience for interaction that might occur +through an attached keyboard.

+ +

These topics and more are discussed in the following lessons.

+ + +

Lessons

+ +
+
Specifying the Input Method Type
+
Learn how to show certain soft input methods, such as those designed for phone numbers, web + addresses, or other formats. Also learn how to specify characteristics such + as spelling suggestion behavior and action buttons such as Done or Next. +
+
Handling Input Method Visibility
+
Learn how to specify when to show the soft input method and how + your layout should adjust to the reduced screen space. +
+
Supporting Keyboard Navigation
+
Learn how to verify that users can navigate your app using a keyboard + and how to make any necessary changes to the navigation order. +
+
Handling Keyboard Actions
+
Learn how to respond directly to keyboard input for user actions. +
+ +
\ No newline at end of file diff --git a/docs/html/training/keyboard-input/navigation.jd b/docs/html/training/keyboard-input/navigation.jd new file mode 100644 index 0000000000000..6e26ab2d16d62 --- /dev/null +++ b/docs/html/training/keyboard-input/navigation.jd @@ -0,0 +1,166 @@ +page.title=Supporting Keyboard Navigation + +trainingnavtop=true + +@jd:body + +
+
+ +

This lesson teaches you to

+
  1. Test Your App
  2. Handle Tab Navigation
  3. Handle Directional Navigation
+ +

You should also read

+ + +
+
+ +

In addition to soft input methods (such as on-screen keyboards), Android supports +physical keyboards attached to the device. A keyboard offers not only a convenient +mode for text input, but also offers a way for users to navigate and +interact with your app. Although most hand-held devices such as phones use touch as the +primary mode of interaction, +tablets and similar devices are growing in popularity and many users like to attach +keyboard accessories.

+ +

As more Android devices offer this kind of experience, it's important that +you optimize your app to support interaction through a keyboard. This lesson describes +how you can better support navigation with a keyboard.

+ +

Note: +Supporting of directional navigation in your application is also important in ensuring that +your application is accessible +to users who do not navigate using visual cues. Fully supporting directional navigation in your +application can also help you automate user +interface testing with tools like uiautomator.

+ + + +

Test Your App

+ +

It's possible that users can already navigate your app using a keyboard, because the +Android system enables most of the necessary behaviors by default.

+ +

All interactive widgets provided by the Android framework (such as {@link android.widget.Button} +and {@link android.widget.EditText}) are focusable. This means users can navigate with +control devices such as a D-pad or keyboard and each widget glows or otherwise changes its +appearance when it gains input focus.

+ +

To test your app:

+
    +
  1. Install your app on a device that offers a hardware keyboard. +

    If you don't have a hardware device with a keyboard, connect a Bluetooth keyboard + or a USB keyboard (though not all devices support USB accessories).

    +

    You can also use the Android emulator:

    +
      +
    1. In the AVD Manager, either click New Device or + select an existing profile and click Clone.
    2. +
    3. In the window that appears, ensure that Keyboard and + DPad are enabled.
    4. +
    +
  2. +
  3. To test your app, use only the Tab key to navigate through your UI, ensuring that + each UI control gets focus as expected. +

    Look for any instances in which the focus moves in a way you don't expect.

    +
  4. +
  5. Start from the beginning of your app and instead use the direction controls + (arrow keys on the keyboard) to navigate your app. +

    From each focusable element in your UI, press Up, Down, Left, and Right.

    +

    Look for any instances in which the focus moves in a way you don't expect.

    +
  6. +
+ +

If you encounter any instances where navigating with the Tab key or direction controls +does not do what you expect, specify where the focus should go in your layout, as discussed +in the following sections.

+ + + +

Handle Tab Navigation

+ +

When a user navigates your app using the keyboard Tab key, +the system passes input focus between elements based +on the order in which they appear in the layout. If you use a relative layout, for example, +and the order of elements on the screen is different than the order in the file, then you might need +to manually specify the focus order.

+ +

For example, in the following layout, two buttons are aligned to the right side and a text field +is aligned to the left of the second button. In order to pass focus from the first button to the +text field, then to the second button, the layout needs to explicitly define the focus order +for each of the focusable elements with the {@code +android:nextFocusForward} attribute:

+ +
+<RelativeLayout ...>
+    <Button
+        android:id="@+id/button1"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentRight="true"
+        android:nextFocusForward="@+id/editText1"
+        ... />
+    <Button
+        android:id="@+id/button2"
+        android:layout_below="@id/button1"
+        android:nextFocusForward="@+id/button1"
+        ... />
+    <EditText
+        android:id="@id/editText1"
+        android:layout_alignBottom="@+id/button2"
+        android:layout_toLeftOf="@id/button2"
+        android:nextFocusForward="@+id/button2"
+        ...  />
+    ...
+</RelativeLayout>
+
+ +

Now instead of sending focus from {@code button1} to {@code button2} then {@code editText1}, the +focus appropriately moves according to the appearance on the screen: from +{@code button1} to {@code editText1} then {@code button2}.

+ + +

Handle Directional Navigation

+ +

Users can also navigate your app using the arrow keys on a +keyboard (the behavior is the same as when navigating with a D-pad or trackball). +The system provides a best-guess as to which view should be given focus +in a given direction based on the layout of the views on screen. Sometimes, however, the system +might guess wrong.

+ +

If the system does not pass focus to the appropriate view when navigating in a given direction, +specify which view should receive focus with the following attributes:

+ + +

Each attribute designates the next view to receive focus when the user navigates +in that direction, as specified by the view ID. For example:

+ +
+<Button
+    android:id="@+id/button1"
+    android:nextFocusRight="@+id/button2"
+    android:nextFocusDown="@+id/editText1"
+    ... />
+<Button
+    android:id="@id/button2"
+    android:nextFocusLeft="@id/button1"
+    android:nextFocusDown="@id/editText1"
+    ... />
+<EditText
+    android:id="@id/editText1"
+    android:nextFocusUp="@id/button1"
+    ...  />
+
+ diff --git a/docs/html/training/keyboard-input/style.jd b/docs/html/training/keyboard-input/style.jd new file mode 100644 index 0000000000000..b0e506cf756c9 --- /dev/null +++ b/docs/html/training/keyboard-input/style.jd @@ -0,0 +1,171 @@ +page.title=Specifying the Input Method Type + +trainingnavtop=true + +@jd:body + +
+
+ +

This lesson teaches you to

+
    +
  1. Specify the Keyboard Type
  2. +
  3. Enable Spelling Suggestions and Other Behaviors
  4. +
  5. Specify the Input Method Action
  6. +
+ +

You should also read

+ + +
+
+ + +

Every text field expects a certain type of text input, such as an +email address, phone number, or just plain text. So it's important +that you specify the input type for each text field in your app +so the system displays the appropriate soft input method (such as an on-screen keyboard).

+ +

Beyond the type of buttons available with an input method, you should specify +behaviors such as whether the input method provides spelling suggestions, +capitalizes new sentences, and replaces the carriage return button with an +action button such as a Done or Next. +This lesson shows how to specify these characteristics.

+ + + +

Specify the Keyboard Type

+ +

You should always declare the input method for your text fields by adding +the {@code android:inputType} attribute to the {@link android.widget.EditText +<EditText>} element.

+ +
+ +

Figure 1. The {@code phone} input type.

+
+ +

For example, if you'd like an input method for entering a phone number, +use the {@code "phone"} value:

+
+<EditText
+    android:id="@+id/phone"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:hint="@string/phone_hint"
+    android:inputType="phone" />
+
+ +
+ +

Figure 2. The {@code textPassword} input type.

+
+ +

Or if the text field is for a password, use the {@code "textPassword"} value +so the text field conceals the user's input:

+
+<EditText
+    android:id="@+id/password"
+    android:hint="@string/password_hint"
+    android:inputType="textPassword"
+    ... />    
+
+ +

There are several possible values documented with the +{@code android:inputType} attribute and +some of the values can be combined to specify the input method +appearance and additional behaviors.

+ + + +

Enable Spelling Suggestions and Other Behaviors

+ +
+ +

Figure 3. Adding {@code textAutoCorrect} +provides auto-correction for misspellings.

+
+ +

The {@code android:inputType} attribute allows you to specify various behaviors for the +input method. Most importantly, if your text field is intended for basic text input (such +as for a text message), you should enable auto spelling correction with the +{@code "textAutoCorrect"} value.

+ +

You can combine different behaviors and input method styles with the +{@code android:inputType} attribute. For example, +here's how to create a text field that capitalizes the first word of a sentence +and also auto-corrects misspellings:

+ +
+<EditText
+    android:id="@+id/message"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:inputType=
+        "textCapSentences|textAutoCorrect"
+    ... />
+
+ + + + +

Specify the Input Method Action

+ +

Most soft input methods provide a user action button in the +bottom corner that's appropriate for the current text field. +By default, the system uses this button for either a Next or +Done action unless your text field allows multi-line text (such as with {@code +android:inputType="textMultiLine"}), in which case the action button is a carriage return. +However, you can specify additional actions that might be more appropriate for your +text field, such as Send or Go.

+ +

To specify the keyboard action button, use the {@code +android:imeOptions} attribute with an action value such as {@code "actionSend"} or +{@code "actionSearch"}. For example:

+ +
+ +

Figure 4. The Send button appears when you declare +{@code android:imeOptions="actionSend"}.

+
+ +
+<EditText
+    android:id="@+id/search"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:hint="@string/search_hint"
+    android:inputType="text"
+    android:imeOptions="actionSend" />
+
+ +

You can then listen for presses on the action button by defining a +{@link android.widget.TextView.OnEditorActionListener} for the {@link android.widget.EditText} +element. In your listener, respond to the appropriate IME action ID defined in the +{@link android.view.inputmethod.EditorInfo} class, such as +{@link android.view.inputmethod.EditorInfo#IME_ACTION_SEND}. For example:

+ +
+EditText editText = (EditText) findViewById(R.id.search);
+editText.setOnEditorActionListener(new OnEditorActionListener() {
+    @Override
+    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+        boolean handled = false;
+        if (actionId == EditorInfo.IME_ACTION_SEND) {
+            sendMessage();
+            handled = true;
+        }
+        return handled;
+    }
+});
+
+ + + diff --git a/docs/html/training/keyboard-input/visibility.jd b/docs/html/training/keyboard-input/visibility.jd new file mode 100644 index 0000000000000..5dc6fc260b01a --- /dev/null +++ b/docs/html/training/keyboard-input/visibility.jd @@ -0,0 +1,133 @@ +page.title=Handling Input Method Visibility + +trainingnavtop=true + +@jd:body + + + + +

When input focus moves into or out of an editable text field, Android shows +or hides the input method (such as the on-screen keyboard) as appropriate. +The system also makes decisions about +how your UI and the text field appear above the input method. For example, when the vertical +space on the screen is constrained, the text field might fill all space above the input method. +For most apps, these default behaviors are all that's needed.

+ +

In some cases, though, you might want to more directly control +the visibility of the input method and specify how you'd like your layout to appear +when the input method is visible. This lesson explains how to control and respond to +the input method visibility.

+ + +

Show the Input Method When the Activity Starts

+ +

Although Android gives focus to the first text field in your layout +when the activity starts, it does not show the input method. This behavior is appropriate because +entering text might not be the primary task in the activity. However, if entering +text is indeed the primary task (such as in a login screen), then you probably want +the input method to appear by default.

+ +

To show the input method when your activity starts, add the {@code +android:windowSoftInputMode} attribute to the {@code <activity>} element with the +{@code "stateVisible"} value. For example:

+ +
+<application ... >
+    <activity
+        android:windowSoftInputMode="stateVisible" ... >
+        ...
+    </activity>
+    ...
+</application>
+
+ +

Note: If the user's device has an attached hardware keyboard, +the soft input method does not appear.

+ + +

Show the Input Method On Demand

+ +

If there is a method in your activity's lifecycle where you want to ensure that +the input method is visible, you can use the {@link android.view.inputmethod.InputMethodManager} +to show it.

+ +

For example, the following method takes a {@link android.view.View} in which the user should type +something, calls {@link android.view.View#requestFocus requestFocus()} to give it focus, then +{@link android.view.inputmethod.InputMethodManager#showSoftInput showSoftInput()} to open +the input method:

+ +
+public void showSoftKeyboard(View view) {
+    if (view.requestFocus()) {
+        InputMethodManager imm = (InputMethodManager)
+                getSystemService(Context.INPUT_METHOD_SERVICE);
+        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
+    }
+}
+
+ +

Note: +Once the input method is visible, you should not programmatically hide it. The system +hides the input method when the user finishes the task in the text field or the user can hide +it with a system control (such as with the Back button).

+ + + + +

Specify How Your UI Should Respond

+ +

When the input method appears on the screen, it reduces the amount of space available +for your app's UI. The system makes a decision as to how it should adjust the visible portion +of your UI, but it might not get it right. To ensure the best behavior for your app, +you should specify how you'd like the system to display your UI in the remaining space.

+ +

To declare your preferred treatment in an activity, use the {@code +android:windowSoftInputMode} attribute in your manifest's {@code <activity>} element +with one of the "adjust" values.

+ +

For example, to ensure that the system resizes your layout to the available space—which +ensures that all of your layout content is accessible (even though it probably requires +scrolling)—use {@code "adjustResize"}:

+ +
+<application ... >
+    <activity
+        android:windowSoftInputMode="adjustResize" ... >
+        ...
+    </activity>
+    ...
+</application>
+
+ +

You can combine the adjustment specification with the initial input method visibility specification from above:

+ +
+    <activity
+        android:windowSoftInputMode="stateVisible|adjustResize" ... >
+        ...
+    </activity>
+
+ + +

Specifying {@code "adjustResize"} is important if your UI includes controls that the +user might need to access immediately after or while performing text input. For example, +if you use a relative layout to place a button bar at the bottom of the screen, using +{@code "adjustResize"} resizes the layout so the button bar appears above the input method.

+ + + + + + + diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index 17f8b91251403..951804683d4ca 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -194,6 +194,8 @@ + + + - - + + + +