Fixes linebreaks that had gotten altered during the run-up to 5.0 release.
Change-Id: I7be014d27ef85631b5e26ad2b3ab81d3a12d1813
This commit is contained in:
@@ -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="@xml/method" />
|
|||||||
</service>
|
</service>
|
||||||
</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>
|
||||||
<!-- Optional: an activity for controlling the IME settings -->
|
<!-- Optional: an activity for controlling the IME settings -->
|
||||||
@@ -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>
|
||||||
@Override
|
@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 don’t want to show anything. A null response is
|
||||||
return a layout that shows
|
the default behavior, so you don’t have to implement this if you don’t provide suggestions.</p>
|
||||||
word suggestions, or return null if you don’t want to show anything. A
|
|
||||||
null response is the
|
|
||||||
default behavior, so you don’t have to implement this if you don’t
|
|
||||||
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><subtype></code> element. The following snippet defines an IME with two
|
||||||
<code><subtype></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
|
|||||||
/>
|
/>
|
||||||
</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 subtype’s locale label. This is demonstrated in the next two snippets.
|
||||||
that is the same as the subtype’s 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" />
|
android:imeSubtypeMode="keyboard" />
|
||||||
</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 & input”
|
A user can control how subtypes are used in the “Language & 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>
|
||||||
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
|
<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>
|
||||||
Reference in New Issue
Block a user