Fixes linebreaks that had gotten altered during the run-up to 5.0 release.

Change-Id: I7be014d27ef85631b5e26ad2b3ab81d3a12d1813
This commit is contained in:
David Friedman
2014-10-27 18:19:55 -07:00
parent 40bf63e0f0
commit 0fa6edced7

View File

@@ -41,8 +41,8 @@ page.tags=ime,keyboard,inputmethodservice
<p> <p>
To add an IME to the Android system, you create an Android application To add an IME to the Android system, you create an Android application
containing a class that extends {@link android.inputmethodservice.InputMethodService}. In containing a class that extends {@link android.inputmethodservice.InputMethodService}. In
addition, you usually create a "settings" activity that passes options to the IME addition, you usually create a "settings" activity that passes options to the IME service. You
service. You can also define a settings UI that's displayed as part of the system settings. can also define a settings UI that's displayed as part of the system settings.
</p> </p>
<p>This guide covers the following:</p> <p>This guide covers the following:</p>
<ul> <ul>
@@ -70,29 +70,22 @@ page.tags=ime,keyboard,inputmethodservice
<strong>Figure 1.</strong> The life cycle of an IME. <strong>Figure 1.</strong> The life cycle of an IME.
</p> </p>
<p> <p>
The following sections describe how to implement the UI and code associated The following sections describe how to implement the UI and code associated with an IME that
with an IME that
follows this lifecycle. follows this lifecycle.
</p> </p>
<h2 id="DefiningIME">Declaring IME Components in the Manifest</h2> <h2 id="DefiningIME">Declaring IME Components in the Manifest</h2>
<p> <p>
In the Android system, an IME is an Android application that contains a In the Android system, an IME is an Android application that contains a special IME service.
special IME service. The application's manifest file must declare the service, request the necessary permissions,
The application's manifest file must declare the service, request the provide an intent filter that matches the action <code>action.view.InputMethod</code>, and
necessary permissions, provide metadata that defines characteristics of the IME. In addition, to provide a settings
provide an intent filter that matches the action interface that allows the user to modify the behavior of the IME, you can define a "settings"
<code>action.view.InputMethod</code>, and
provide metadata that defines characteristics of the IME. In addition, to
provide a settings
interface that allows the user to modify the behavior of the IME, you can
define a "settings"
activity that can be launched from System Settings. activity that can be launched from System Settings.
</p> </p>
<p> <p>
The following snippet declares an IME service. It requests the permission The following snippet declares an IME service. It requests the permission
{@link android.Manifest.permission#BIND_INPUT_METHOD} to allow the service to {@link android.Manifest.permission#BIND_INPUT_METHOD} to allow the service to connect the IME
connect the IME to to the system, sets up an intent filter that matches the action
the system, sets up an intent filter that matches the action
<code>android.view.InputMethod</code>, and defines metadata for the IME: <code>android.view.InputMethod</code>, and defines metadata for the IME:
</p> </p>
<pre> <pre>
@@ -108,10 +101,8 @@ android:resource="&#64;xml/method" /&gt;
&lt;/service&gt; &lt;/service&gt;
</pre> </pre>
<p> <p>
This next snippet declares the settings activity for the IME. It has an This next snippet declares the settings activity for the IME. It has an intent filter for
intent filter for {@link android.content.Intent#ACTION_MAIN} that indicates this activity is the main entry point
{@link android.content.Intent#ACTION_MAIN} that indicates this activity is
the main entry point
for the IME application:</p> for the IME application:</p>
<pre> <pre>
&lt;!-- Optional: an activity for controlling the IME settings --&gt; &lt;!-- Optional: an activity for controlling the IME settings --&gt;
@@ -127,23 +118,18 @@ the main entry point
</p> </p>
<h2 id="IMEAPI">The Input Method API</h2> <h2 id="IMEAPI">The Input Method API</h2>
<p> <p>
Classes specific to IMEs are found in the {@link android.inputmethodservice} and {@link android.view.inputmethod} Classes specific to IMEs are found in the {@link android.inputmethodservice} and
packages. The {@link android.view.KeyEvent} class is important for handling keyboard {@link android.view.inputmethod} packages. The {@link android.view.KeyEvent} class is
characters. important for handling keyboard characters.
</p> </p>
<p> <p>
The central part of an IME is a service component, a class that extends The central part of an IME is a service component, a class that extends
{@link android.inputmethodservice.InputMethodService}. In addition to {@link android.inputmethodservice.InputMethodService}. In addition to implementing the
implementing the normal service lifecycle, this class has callbacks for providing your IME's UI, handling user
normal service lifecycle, this class has callbacks for providing your IME's input, and delivering text to the field that currently has focus. By default, the
UI, handling user {@link android.inputmethodservice.InputMethodService} class provides most of the implementation
input, and delivering text to the field that currently has focus. By for managing the state and visibility of the IME and communicating with the current input
default, the field.
{@link android.inputmethodservice.InputMethodService} class provides most
of the implementation
for managing the state and visibility of the IME and communicating with the
current
input field.
</p> </p>
<p> <p>
The following classes are also important: The following classes are also important:
@@ -152,45 +138,32 @@ current
<dt>{@link android.view.inputmethod.BaseInputConnection}</dt> <dt>{@link android.view.inputmethod.BaseInputConnection}</dt>
<dd> <dd>
Defines the communication channel from an {@link android.view.inputmethod.InputMethod} Defines the communication channel from an {@link android.view.inputmethod.InputMethod}
back to the application that is receiving its input. You use it to read back to the application that is receiving its input. You use it to read text around the
text around the cursor, commit text to the text box, and send raw key events to the application.
cursor, commit text to the text box, and send raw key events to the Applications should extend this class rather than implementing the base interface
application.
Applications should extend this class rather than implementing the base
interface
{@link android.view.inputmethod.InputConnection}. {@link android.view.inputmethod.InputConnection}.
</dd> </dd>
<dt>{@link android.inputmethodservice.KeyboardView}</dt> <dt>{@link android.inputmethodservice.KeyboardView}</dt>
<dd> <dd>
An extension of {@link android.view.View} that renders a keyboard and An extension of {@link android.view.View} that renders a keyboard and responds to user
responds to user
input events. The keyboard layout is specified by an instance of input events. The keyboard layout is specified by an instance of
{@link android.inputmethodservice.Keyboard}, which you can define in an {@link android.inputmethodservice.Keyboard}, which you can define in an XML file.
XML file.
</dd> </dd>
</dl> </dl>
<h2 id="IMEUI">Designing the Input Method UI</h2> <h2 id="IMEUI">Designing the Input Method UI</h2>
<p> <p>
There are two main visual elements for an IME: the <strong>input</strong> There are two main visual elements for an IME: the <strong>input</strong> view and the
view and the <strong>candidates</strong> view. You only have to implement the elements that are relevant to
<strong>candidates</strong> view. You only have to implement the elements
that are relevant to
the input method you're designing. the input method you're designing.
</p> </p>
<h3 id="InputView">Input view</h3> <h3 id="InputView">Input view</h3>
<p> <p>
The input view is the UI where the user inputs text in the form of The input view is the UI where the user inputs text in the form of keyclicks, handwriting or
keyclicks, handwriting or gestures. When the IME is displayed for the first time, the system calls the
gestures. When the IME is displayed for the first time, the system calls {@link android.inputmethodservice.InputMethodService#onCreateInputView()} callback. In your
the implementation of this method, you create the layout you want to display in the IME
{@link android.inputmethodservice.InputMethodService#onCreateInputView()} window and return the layout to the system. This snippet is an example of implementing the
callback. In your {@link android.inputmethodservice.InputMethodService#onCreateInputView()} method:
implementation of this method, you create the layout you want to display in
the IME
window and return the layout to the system. This snippet is an example of
implementing the
{@link android.inputmethodservice.InputMethodService#onCreateInputView()}
method:
<pre> <pre>
&#64;Override &#64;Override
public View onCreateInputView() { public View onCreateInputView() {
@@ -215,17 +188,12 @@ traditional QWERTY keyboard,
</p> </p>
<h3 id="CandidateView">Candidates view</h3> <h3 id="CandidateView">Candidates view</h3>
<p> <p>
The candidates view is the UI where the IME displays potential word The candidates view is the UI where the IME displays potential word corrections or
corrections or
suggestions for the user to select. In the IME lifecycle, the system calls suggestions for the user to select. In the IME lifecycle, the system calls
{@link android.inputmethodservice.InputMethodService#onCreateCandidatesView()} when {@link android.inputmethodservice.InputMethodService#onCreateCandidatesView()} when it's ready
it's ready to display the candidates view. In your implementation of this method, return a layout that
to display the candidates view. In your implementation of this method, shows word suggestions, or return null if you dont want to show anything. A null response is
return a layout that shows the default behavior, so you dont have to implement this if you dont provide suggestions.</p>
word suggestions, or return null if you dont want to show anything. A
null response is the
default behavior, so you dont have to implement this if you dont
provide suggestions.</p>
<p> <p>
For an example implementation that provides user suggestions, see the For an example implementation that provides user suggestions, see the
<a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/"> <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
@@ -237,32 +205,22 @@ provide suggestions.</p>
</p> </p>
<h4>Handling multiple screen sizes</h4> <h4>Handling multiple screen sizes</h4>
<p> <p>
The UI for your IME must be able to scale for different screen sizes, and The UI for your IME must be able to scale for different screen sizes, and it also
it also must handle both landscape and portrait orientations. In non-fullscreen IME mode, leave
must handle both landscape and portrait orientations. In non-fullscreen IME sufficient space for the application to show the text field and any associated context, so that
mode, leave no more than half the screen is occupied by the IME. In fullscreen IME mode this is not an
sufficient space for the application to show the text field and any
associated context, so that
no more than half the screen is occupied by the IME. In fullscreen IME mode
this is not an
issue. issue.
</p> </p>
<h4>Handling different input types</h4> <h4>Handling different input types</h4>
<p> <p>
Android text fields allow you to set a specific input type, such as free Android text fields allow you to set a specific input type, such as free-form text, numbers,
form text, numbers, URLs, email addresses, and search strings. When you implement a new IME, you need to detect
URLs, email addresses, and search strings. When you implement a new IME, the input type of each field and provide the appropriate interface for it. However, you
you need to don't have to set up your IME to check that the user entered text valid for the input type;
detect the input type of each field and provide the appropriate interface that's the responsibility of the application that owns the text field.
for it. However, you
don't have to set up your IME to check that the user entered text
valid for the
input type; that's the responsibility of the application that owns the text
field.
</p> </p>
<p> <p>
For example, here are screenshots of the interfaces that the Latin IME For example, here are screenshots of the interfaces that the Latin IME provided with the
provided with the
Android platform provides for text and phone number inputs: Android platform provides for text and phone number inputs:
</p> </p>
<img src="{@docRoot}resources/articles/images/inputmethod_text_type_screenshot.png" alt="" height="142" id="figure2" /> <img src="{@docRoot}resources/articles/images/inputmethod_text_type_screenshot.png" alt="" height="142" id="figure2" />
@@ -273,18 +231,14 @@ provided with the
<p> <p>
When an input field receives focus and your IME starts, the system calls When an input field receives focus and your IME starts, the system calls
{@link android.inputmethodservice.InputMethodService#onStartInputView(EditorInfo, boolean) onStartInputView()}, {@link android.inputmethodservice.InputMethodService#onStartInputView(EditorInfo, boolean) onStartInputView()},
passing in an {@link android.view.inputmethod.EditorInfo} object that passing in an {@link android.view.inputmethod.EditorInfo} object that contains details about
contains details about the input type and other attributes of the text the input type and other attributes of the text field. In this object, the
field. In this object, {@link android.view.inputmethod.EditorInfo#inputType} field contains the text field's input
the {@link android.view.inputmethod.EditorInfo#inputType} field contains
the text field's input
type. type.
</p> </p>
<p> <p>
The {@link android.view.inputmethod.EditorInfo#inputType} field is an The {@link android.view.inputmethod.EditorInfo#inputType} field is an <code>int</code>
<code>int</code> that contains bit patterns for various input type settings. To test it for the text field's
that contains bit patterns for various input type settings. To test it for
the text field's
input type, mask it with the constant {@link android.text.InputType#TYPE_MASK_CLASS}, like input type, mask it with the constant {@link android.text.InputType#TYPE_MASK_CLASS}, like
this: this:
</p> </p>
@@ -297,8 +251,7 @@ The input type bit pattern can have one of several values, including:
<dl> <dl>
<dt>{@link android.text.InputType#TYPE_CLASS_NUMBER}</dt> <dt>{@link android.text.InputType#TYPE_CLASS_NUMBER}</dt>
<dd> <dd>
A text field for entering numbers. As illustrated in the previous A text field for entering numbers. As illustrated in the previous screen shot, the
screen shot, the
Latin IME displays a number pad for fields of this type. Latin IME displays a number pad for fields of this type.
</dd> </dd>
<dt>{@link android.text.InputType#TYPE_CLASS_DATETIME}</dt> <dt>{@link android.text.InputType#TYPE_CLASS_DATETIME}</dt>
@@ -315,103 +268,86 @@ screen shot, the
</dd> </dd>
</dl> </dl>
<p> <p>
These constants are described in more detail in the reference documentation These constants are described in more detail in the reference documentation for
for
{@link android.text.InputType}. {@link android.text.InputType}.
</p> </p>
<p> <p>
The {@link android.view.inputmethod.EditorInfo#inputType} field can contain The {@link android.view.inputmethod.EditorInfo#inputType} field can contain other bits that
other bits that
indicate a variant of the text field type, such as: indicate a variant of the text field type, such as:
</p> </p>
<dl> <dl>
<dt>{@link android.text.InputType#TYPE_TEXT_VARIATION_PASSWORD}</dt> <dt>{@link android.text.InputType#TYPE_TEXT_VARIATION_PASSWORD}</dt>
<dd> <dd>
A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for entering passwords. The
entering passwords. The
input method will display dingbats instead of the actual text. input method will display dingbats instead of the actual text.
</dd> </dd>
<dt>{@link android.text.InputType#TYPE_TEXT_VARIATION_URI}</dt> <dt>{@link android.text.InputType#TYPE_TEXT_VARIATION_URI}</dt>
<dd> <dd>
A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for entering web URLs and
entering web URLs and
other Uniform Resource Identifiers (URIs). other Uniform Resource Identifiers (URIs).
</dd> </dd>
<dt>{@link android.text.InputType#TYPE_TEXT_FLAG_AUTO_COMPLETE}</dt> <dt>{@link android.text.InputType#TYPE_TEXT_FLAG_AUTO_COMPLETE}</dt>
<dd> <dd>
A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for entering text that the
entering text that the application "auto-completes" from a dictionary, search, or other facility.
application "auto-completes" from a dictionary, search, or other
facility.
</dd> </dd>
</dl> </dl>
<p> <p>
Remember to mask {@link android.view.inputmethod.EditorInfo#inputType} with Remember to mask {@link android.view.inputmethod.EditorInfo#inputType} with the appropriate
the appropriate constant when you test for these variants. The available mask constants are listed in the
constant when you test for these variants. The available mask constants are
listed in the
reference documentation for {@link android.text.InputType}. reference documentation for {@link android.text.InputType}.
</p> </p>
<p class="caution"> <p class="caution">
<strong>Caution:</strong> In your own IME, make sure you handle text <strong>Caution:</strong> In your own IME, make sure you handle text correctly when you send it
correctly when you send it to a password field. Hide the password in your UI both in the input view and in the candidates
to a password field. Hide the password in your UI both in the input view view. Also remember that you shouldn't store passwords on a device. To learn more, see the
and in the candidates <a href="{@docRoot}guide/practices/security.html">Designing for Security</a> guide.
view. Also remember that you shouldn't store passwords on a device. To
learn more, see the <a href="{@docRoot}guide/practices/security.html">Designing for Security</a>
guide.
</p> </p>
<h2 id="SendText">Sending Text to the Application</h2> <h2 id="SendText">Sending Text to the Application</h2>
<p> <p>
As the user inputs text with your IME, you can send text to the application As the user inputs text with your IME, you can send text to the application by sending
by individual key events or by editing the text around the cursor in the application's text
sending individual key events or by editing the text around the cursor in
the application's text
field. In either case, you use an instance of {@link android.view.inputmethod.InputConnection} field. In either case, you use an instance of {@link android.view.inputmethod.InputConnection}
to deliver the text. To get this instance, call to deliver the text. To get this instance, call
{@link android.inputmethodservice.InputMethodService#getCurrentInputConnection InputMethodService.getCurrentInputConnection()}. {@link android.inputmethodservice.InputMethodService#getCurrentInputConnection InputMethodService.getCurrentInputConnection()}.
</p> </p>
<h3 id="EditingCursor">Editing the text around the cursor</h3> <h3 id="EditingCursor">Editing the text around the cursor</h3>
<p> <p>
When you're handling the editing of existing text in a text field, some of When you're handling the editing of existing text in a text field, some of the more useful
the more useful
methods in {@link android.view.inputmethod.BaseInputConnection} are: methods in {@link android.view.inputmethod.BaseInputConnection} are:
</p> </p>
<dl> <dl>
<dt> <dt>
{@link android.view.inputmethod.BaseInputConnection#getTextBeforeCursor(int, int) getTextBeforeCursor()}</dt> {@link android.view.inputmethod.BaseInputConnection#getTextBeforeCursor(int, int) getTextBeforeCursor()}</dt>
<dd> <dd>
Returns a {@link java.lang.CharSequence} containing the number of Returns a {@link java.lang.CharSequence} containing the number of requested characters
requested characters
before the current cursor position. before the current cursor position.
</dd> </dd>
<dt> <dt>
{@link android.view.inputmethod.BaseInputConnection#getTextAfterCursor(int, int) getTextAfterCursor()} {@link android.view.inputmethod.BaseInputConnection#getTextAfterCursor(int, int) getTextAfterCursor()}
</dt> </dt>
<dd> <dd>
Returns a {@link java.lang.CharSequence} containing the number of Returns a {@link java.lang.CharSequence} containing the number of requested characters
requested characters following the current cursor position. following the current cursor position.
</dd> </dd>
<dt> <dt>
{@link android.view.inputmethod.BaseInputConnection#deleteSurroundingText(int, int) deleteSurroundingText()} {@link android.view.inputmethod.BaseInputConnection#deleteSurroundingText(int, int) deleteSurroundingText()}
</dt> </dt>
<dd> <dd>
Deletes the specified number of characters before and following the Deletes the specified number of characters before and following the current cursor
current cursor
position. position.
</dd> </dd>
<dt> <dt>
{@link android.view.inputmethod.BaseInputConnection#commitText(CharSequence, int) commitText()} {@link android.view.inputmethod.BaseInputConnection#commitText(CharSequence, int) commitText()}
</dt> </dt>
<dd> <dd>
Commit a {@link java.lang.CharSequence} to the text field and set a new Commit a {@link java.lang.CharSequence} to the text field and set a new cursor
cursor
position. position.
</dd> </dd>
</dl> </dl>
<p> <p>
For example, the following snippet shows how to replace the four characters to For example, the following snippet shows how to replace the four characters to the left of the
the left of the cursor with the text "Hello!": cursor with the text "Hello!":
</p> </p>
<pre> <pre>
InputConnection ic = getCurrentInputConnection(); InputConnection ic = getCurrentInputConnection();
@@ -424,12 +360,9 @@ the left of the cursor with the text "Hello!":
</pre> </pre>
<h3 id="ComposeThenCommit">Composing text before committing</h3> <h3 id="ComposeThenCommit">Composing text before committing</h3>
<p> <p>
If your IME does text prediction or requires multiple steps to compose a If your IME does text prediction or requires multiple steps to compose a glyph or
glyph or word, you can show the progress in the text field until the user commits the word, and then you
word, you can show the progress in the text field until the user commits can replace the partial composition with the completed text. You may give special treatment to
the word, and then you
can replace the partial composition with the completed text. You may give
special treatment to
the text by adding a "span" to it when you pass it to the text by adding a "span" to it when you pass it to
{@link android.view.inputmethod.InputConnection#setComposingText setComposingText()}. {@link android.view.inputmethod.InputConnection#setComposingText setComposingText()}.
</p> </p>
@@ -465,14 +398,10 @@ alt="" height="31"
</p> </p>
<h3 id="HardwareKeyEvents">Intercepting hardware key events</h3> <h3 id="HardwareKeyEvents">Intercepting hardware key events</h3>
<p> <p>
Even though the input method window doesn't have explicit focus, it Even though the input method window doesn't have explicit focus, it receives hardware key
receives hardware key events first and can choose to consume them or forward them along to the application. For
events first and can choose to consume them or forward them along to the example, you may want to consume the directional keys to navigate within your UI for candidate
application. For selection during composition. You may also want to trap the back key to dismiss any popups
example, you may want to consume the directional keys to navigate within
your UI for candidate
selection during composition. You may also want to trap the back key to
dismiss any popups
originating from the input method window.</p> originating from the input method window.</p>
<p> <p>
To intercept hardware keys, override To intercept hardware keys, override
@@ -483,45 +412,36 @@ dismiss any popups
SoftKeyboard</a> sample app for an example. SoftKeyboard</a> sample app for an example.
</p> </p>
<p> <p>
Remember to call the <code>super()</code> method for keys you don't want to Remember to call the <code>super()</code> method for keys you don't want to handle yourself.
handle yourself.
</p> </p>
<h2 id="IMESubTypes">Creating an IME Subtype</h2> <h2 id="IMESubTypes">Creating an IME Subtype</h2>
<p> <p>
Subtypes allow the IME to expose multiple input modes and languages Subtypes allow the IME to expose multiple input modes and languages supported by an IME. A
supported by an IME. A subtype can represent: subtype can represent:
</p> </p>
<ul> <ul>
<li>A locale such as en_US or fr_FR</li> <li>A locale such as en_US or fr_FR</li>
<li>An input mode such as voice, keyboard, or handwriting</li> <li>An input mode such as voice, keyboard, or handwriting</li>
<li> <li>
Other input styles, forms, or properties specific to the IME, such as Other input styles, forms, or properties specific to the IME, such as 10-key or qwerty
10-key or qwerty
keyboard layouts. keyboard layouts.
</li> </li>
</ul> </ul>
<p> <p>
Basically, the mode can be any text such as "keyboard", "voice", and so Basically, the mode can be any text such as "keyboard", "voice", and so forth. A subtype can
forth. A subtype can also expose a combination of these. also expose a combination of these.
</p> </p>
<p> <p>
Subtype information is used for an IME switcher dialog that's available Subtype information is used for an IME switcher dialog that's available from the notification
from the notification bar and also for IME settings. The information also allows the framework to bring up a
bar and also for IME settings. The information also allows the framework to specific subtype of an IME directly. When you build an IME, use the subtype facility, because
bring up a it helps the user identify and switch between different IME languages and modes.
specific subtype of an IME directly. When you build an IME, use the subtype
facility, because
it helps the user identify and switch between different IME languages and
modes.
</p> </p>
<p> <p>
You define subtypes in one of the input method's XML resource files, using You define subtypes in one of the input method's XML resource files, using the
the <code>&lt;subtype&gt;</code> element. The following snippet defines an IME with two
<code>&lt;subtype&gt;</code> element. The following snippet defines an IME subtypes: a keyboard subtype for the US English locale, and another keyboard subtype for the
with two
subtypes: a keyboard subtype for the US English locale, and another
keyboard subtype for the
French language locale for France: French language locale for France:
</p> </p>
<pre> <pre>
@@ -546,10 +466,8 @@ keyboard subtype for the
/&gt; /&gt;
</pre> </pre>
<p> <p>
To ensure that your subtypes are labeled correctly in the UI, use %s to get To ensure that your subtypes are labeled correctly in the UI, use %s to get a subtype label
a subtype label that is the same as the subtypes locale label. This is demonstrated in the next two snippets.
that is the same as the subtypes locale label. This is demonstrated in
the next two snippets.
The first snippet shows part of the input method's XML file: The first snippet shows part of the input method's XML file:
</p> </p>
<pre> <pre>
@@ -560,10 +478,8 @@ the next two snippets.
android:imeSubtypeMode="keyboard" /&gt; android:imeSubtypeMode="keyboard" /&gt;
</pre> </pre>
<p> <p>
The next snippet is part of the IME's <code>strings.xml</code> file. The The next snippet is part of the IME's <code>strings.xml</code> file. The string
string resource <code>label_subtype_generic</code>, which is used by the input method UI definition to
resource <code>label_subtype_generic</code>, which is used by the input
method UI definition to
set the subtype's label, is defined as: set the subtype's label, is defined as:
</p> </p>
<pre> <pre>
@@ -575,12 +491,9 @@ method UI definition to
</p> </p>
<h3 id="SubtypeProcessing">Choosing IME subtypes from the notification bar</h3> <h3 id="SubtypeProcessing">Choosing IME subtypes from the notification bar</h3>
<p> <p>
The Android system manages all subtypes exposed by all IMEs. IME subtypes The Android system manages all subtypes exposed by all IMEs. IME subtypes are
are treated as modes of the IME they belong to. In the notification bar, a user can select an
treated as modes of the IME they belong to. In the notification bar, a user available subtype for the currently-set IME, as shown in the following screenshot:
can select an
available subtype for the currently-set IME, as shown in the following
screenshot:
</p> </p>
<img <img
src="{@docRoot}resources/articles/images/inputmethod_subtype_notification.png" src="{@docRoot}resources/articles/images/inputmethod_subtype_notification.png"
@@ -599,9 +512,9 @@ alt=""
</p> </p>
<h3 id="SubtypeSettings">Choosing IME subtypes from System Settings</h3> <h3 id="SubtypeSettings">Choosing IME subtypes from System Settings</h3>
<p> <p>
A user can control how subtypes are used in the “Language &amp; input” A user can control how subtypes are used in the “Language &amp; input” settings panel in the
settings panel in the System Settings area. In the
System Settings area. In the <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/"> <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
SoftKeyboard</a> sample app, the file <code>InputMethodSettingsFragment.java</code> contains an SoftKeyboard</a> sample app, the file <code>InputMethodSettingsFragment.java</code> contains an
implementation that facilitates a subtype enabler in the IME settings. Refer to the implementation that facilitates a subtype enabler in the IME settings. Refer to the
<a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/"> <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
@@ -617,15 +530,14 @@ alt=""
<h2 id="Switching">Switching among IME Subtypes</h2> <h2 id="Switching">Switching among IME Subtypes</h2>
<p>You can allow users to switch easily among multiple IME subtypes by providing <p>You can allow users to switch easily among multiple IME subtypes by providing a switching key,
a switching key, such as the globe-shaped language icon, as part of the keyboard. Doing so greatly such as the globe-shaped language icon, as part of the keyboard. Doing so greatly improves the
improves the keyboard's usability, and can help avoid user frustration. keyboard's usability, and can help avoid user frustration.
To enable such switching, perform the following steps:</p> To enable such switching, perform the following steps:</p>
<p> <p>
<ol> <ol>
<li>Declare <code>supportsSwitchingToNextInputMethod = "true"</code> in the <li>Declare <code>supportsSwitchingToNextInputMethod = "true"</code> in the input method's XML
input method's XML resource files. Your declaration resource files. Your declaration should look similar to the following snippet:
should look similar to the following snippet:
<pre> <pre>
&lt;input-method xmlns:android="http://schemas.android.com/apk/res/android" &lt;input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.example.softkeyboard.Settings" android:settingsActivity="com.example.softkeyboard.Settings"
@@ -646,8 +558,7 @@ input method's XML resource files. Your declaration
<strong>Caution:</strong> Prior to Android 5.0 (API level 21), <strong>Caution:</strong> Prior to Android 5.0 (API level 21),
{@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod switchToNextInputMethod()} {@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod switchToNextInputMethod()}
is not aware of the <code>supportsSwitchingToNextInputMethod</code> attribute. If the user switches is not aware of the <code>supportsSwitchingToNextInputMethod</code> attribute. If the user switches
into an IME without a switching key, he or she may get stuck in that IME, unable to switch out of it into an IME without a switching key, he or she may get stuck in that IME, unable to switch out of it easily.</p>
easily.</p>
<p> <p>
@@ -662,31 +573,23 @@ easily.</p>
Provide a way for users to set options directly from the IME's UI. Provide a way for users to set options directly from the IME's UI.
</li> </li>
<li> <li>
Because multiple IMEs may be installed on the device, provide a way for the Because multiple IMEs may be installed on the device, provide a way for the user to switch to a
user to switch to a
different IME directly from the input method UI. different IME directly from the input method UI.
</li> </li>
<li> <li>
Bring up the IME's UI quickly. Preload or load on demand any large Bring up the IME's UI quickly. Preload or load on demand any large resources so that users
resources so that users see the IME as soon as they tap on a text field. Cache resources and views for subsequent
see the IME as soon as they tap on a text field. Cache resources and views
for subsequent
invocations of the input method. invocations of the input method.
</li> </li>
<li> <li>
Conversely, you should release large memory allocations soon after the Conversely, you should release large memory allocations soon after the input method window is
input method window is hidden, so that applications can have sufficient memory to run. Consider using a delayed
hidden, so that applications can have sufficient memory to run. Consider message to release resources if the IME is in a hidden state for a few seconds.
using a delayed message
to release resources if the IME is in a hidden state for a few seconds.
</li> </li>
<li> <li>
Make sure that users can enter as many characters as possible for the Make sure that users can enter as many characters as possible for the language or locale
language or locale associated with the IME. Remember that users may use punctuation in passwords or user
associated with the IME. Remember that users may use punctuation in names, so your IME has to provide many different characters to allow users to enter a
passwords or user
names, so your IME has to provide many different characters to allow users
to enter a
password and get access to the device. password and get access to the device.
</li> </li>
</ul> </ul>