Ein Eingabemethoden-Editor (IME) ist ein Steuerelement, mit dem Nutzer Text eingeben können. Android bietet eine Erweiterbares Eingabemethoden-Framework, mit dem Anwendungen Nutzern alternative Eingabemethoden, wie Bildschirmtastaturen oder Spracheingabe. Nach der Installation der IMEs kann der Nutzer einen der folgenden IMEs auswählen: und im gesamten System verwenden. Es kann jeweils nur ein IME aktiviert werden.
Wenn Sie dem Android-System eine IME hinzufügen möchten, erstellen Sie eine Android-Anwendung mit einer Klasse, die InputMethodService
erweitert.
Außerdem erstellen Sie in der Regel eine Aktivität vom Typ „Einstellungen“, die Optionen an den IME-Dienst übergibt. Ich
können auch eine Benutzeroberfläche für Einstellungen definieren, die als Teil der Systemeinstellungen angezeigt wird.
Auf dieser Seite werden die folgenden Themen behandelt:
- Der IME-Lebenszyklus
- IME-Komponenten im App-Manifest deklarieren
- IME API
- IME-UI entwerfen
- Text von einer IME an eine Anwendung senden
- Mit IME-Untertypen arbeiten
- Weitere Hinweise zu Eingabemethoden
Wenn Sie noch nicht mit IMEs gearbeitet haben, lesen Sie den einführenden Artikel. Eingabemethoden auf dem Bildschirm .
IME-Lebenszyklus
Im folgenden Diagramm wird der Lebenszyklus eines IME beschrieben:

In den folgenden Abschnitten wird beschrieben, wie Sie die UI und den Code implementieren, der mit einem IME verknüpft ist, der diesem Lebenszyklus folgt.
IME-Komponenten im Manifest deklarieren
Im Android-System ist eine IME eine Android-Anwendung, die einen speziellen IME-Dienst enthält. In der Manifestdatei der Anwendung muss der Dienst deklariert, die erforderlichen Berechtigungen angefordert, ein Intent-Filter angegeben werden, der mit der Aktion action.view.InputMethod
übereinstimmt, und Metadaten bereitgestellt werden, die die Eigenschaften der IME definieren. Zusätzlich ist eine Einstellungsoberfläche verfügbar, über die
das Verhalten des IME ändert, kannst du eine "Einstellungen" Aktivität, die über die
Systemeinstellungen.
Mit dem folgenden Snippet wird ein IME-Dienst deklariert. Die Berechtigung wird angefordert.
BIND_INPUT_METHOD
Damit der Dienst den IME mit dem System verbinden kann, richtet er einen Intent-Filter ein, der der Aktion entspricht.
android.view.InputMethod
definiert und die Metadaten für den IME definiert:
<!-- Declares the input method service. --> <service android:name="FastInputIME" android:label="@string/fast_input_label" android:permission="android.permission.BIND_INPUT_METHOD"> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> <meta-data android:name="android.view.im" android:resource="@xml/method" /> </service>
Im nächsten Snippet wird die Einstellungsaktivität für die IME deklariert. Sie enthält einen Intent-Filter für
ACTION_MAIN
, die
gibt an, dass diese Aktivität der Haupteinstiegspunkt für die IME-Anwendung ist:
<!-- Optional: an activity for controlling the IME settings. --> <activity android:name="FastInputIMESettings" android:label="@string/fast_input_settings"> <intent-filter> <action android:name="android.intent.action.MAIN"/> </intent-filter> </activity>
Sie können den Zugriff auf die IME-Einstellungen auch direkt über die Benutzeroberfläche gewähren.
Die Eingabemethoden-API
Die spezifischen Klassen für IMEs finden Sie in der
android.inputmethodservice
und
android.view.inputmethod
Pakete. Die KeyEvent
-Klasse ist
für den Umgang mit Tastaturzeichen wichtig.
Der zentrale Teil eines IME ist eine Dienstkomponente – eine Klasse, die
InputMethodService
Neben der Implementierung des normalen Dienstlebenszyklus enthält diese Klasse Rückrufe zum Bereitstellen der Benutzeroberfläche Ihrer IME, zum Verarbeiten von Nutzereingaben und zum Senden von Text an das Feld, das den Fokus hat. Standardmäßig bietet die InputMethodService
-Klasse den Großteil der Implementierung zum Verwalten des Status und der Sichtbarkeit der IME und zur Kommunikation mit dem aktuellen Eingabefeld.
Die folgenden Klassen sind ebenfalls wichtig:
BaseInputConnection
-
Definiert den Kommunikationskanal von einem
InputMethod
zurück an die Anwendung, die die Eingabe empfängt. Sie können damit Text um den Cursor herum lesen, Text in das Textfeld eingeben und Roheingabeereignisse an die Anwendung senden. Anwendungen müssen diese Klasse erweitern, anstatt die BasisschnittstelleInputConnection
zu implementieren. KeyboardView
-
Eine Erweiterung von
View
, die eine Tastatur darstellt und auf Nutzereingabeereignisse reagiert. Das Tastaturlayout wird durch eine Instanz vonKeyboard
angegeben, die Sie in einer XML-Datei definieren können.
Benutzeroberfläche der Eingabemethode entwerfen
Ein IME hat zwei visuelle Hauptelemente: die input-Ansicht und den candidates. Sie müssen nur die Elemente implementieren, Eingabemethode, die Sie entwerfen.
Eingabeansicht
Die Eingabeansicht ist die Benutzeroberfläche, in der der Nutzer Text in Form von Tastenklicks, Handschrift- oder
Gesten verwenden. Wenn die IME zum ersten Mal angezeigt wird, ruft das System den onCreateInputView()
-Callback auf. Erstellen Sie bei der Implementierung dieser Methode das Layout, das im IME angezeigt werden soll.
und das Layout an das System zurückgeben. Das folgende Snippet zeigt ein Beispiel für
die Methode onCreateInputView()
:
Kotlin
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
Java
@Override public View onCreateInputView() { MyKeyboardView inputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null); inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(latinKeyboard); return inputView; }
In diesem Beispiel ist MyKeyboardView
eine Instanz einer benutzerdefinierten Implementierung von KeyboardView
, die eine Keyboard
rendert.
Kandidatenansicht
In der Ansicht „Vorschläge“ werden vom Nutzer auszuwählende potenzielle Wortkorrekturen oder Vorschläge angezeigt. Im Lebenszyklus der IME ruft das System onCreateCandidatesView()
auf, wenn die Ansicht der Vorschläge angezeigt werden kann. Geben Sie bei der Implementierung dieser Methode ein Layout zurück, in dem Wortvorschläge angezeigt werden, oder null, wenn nichts angezeigt werden soll. Eine Nullantwort ist das Standardverhalten. Sie müssen diese Funktion also nicht implementieren, wenn Sie keine Vorschläge machen.
Überlegungen zum UI-Design
In diesem Abschnitt werden einige Aspekte des UI-Designs für IMEs beschrieben.
Mehrere Bildschirmgrößen berücksichtigen
Die Benutzeroberfläche für Ihren IME muss für unterschiedliche Bildschirmgrößen skaliert und im Querformat unterstützt werden können. und Hochformat zu verwenden. Lassen Sie im Modus der Eingabemethode ohne Vollbild ausreichend Platz, damit die Anwendung das Textfeld und den zugehörigen Kontext anzeigen kann. Die IME darf nicht mehr als die Hälfte des Bildschirms einnehmen. Im Vollbildmodus der Eingabemethode ist das kein Problem.
Verschiedene Eingabetypen verarbeiten
Android-Textfelder ermöglichen es Ihnen, einen bestimmten Eingabetyp wie Freitext, Zahlen, URLs, E-Mail-Adressen und Suchzeichenfolgen. Wenn Sie einen neuen IME implementieren, ermitteln Sie den Eingabetyp jedes und die entsprechende Schnittstelle dafür angeben. Sie müssen Ihren IME jedoch nicht so einrichten, Prüft, ob der Benutzer gültigen Text für den Eingabetyp eingibt. Dies liegt in der Verantwortung der Anwendung, der das Textfeld gehört.
Hier ist zum Beispiel die Schnittstelle, die der Latin IME für den Text der Android-Plattform bereitstellt. Eingabe:

Hier sehen Sie die Benutzeroberfläche, die die lateinische Eingabemethode für die numerische Eingabe auf der Android-Plattform bietet:

Wenn ein Eingabefeld den Fokus erhält und die IME gestartet wird, ruft das System onStartInputView()
auf und übergibt ein EditorInfo
-Objekt, das Details zum Eingabetyp und andere Attribute des Textfelds enthält. In diesem Objekt
die
inputType
Feld enthält den Eingabetyp des Textfelds.
Das Feld inputType
ist eine int
, die Bitmuster für verschiedene
Einstellungen für den Eingabetyp. Maskieren Sie es mit der Konstante, um den Eingabetyp des Textfelds zu testen.
TYPE_MASK_CLASS
,
wie hier:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Das Bitmuster des Eingabetyps kann einen von mehreren Werten haben, darunter:
TYPE_CLASS_NUMBER
- Ein Textfeld zur Eingabe von Zahlen. Wie in Abbildung 3 dargestellt, zeigt die lateinische Eingabemethode für Felder dieses Typs eine Ziffernleiste an.
TYPE_CLASS_DATETIME
- Ein Textfeld für die Eingabe von Datum und Uhrzeit.
TYPE_CLASS_PHONE
- Ein Textfeld für die Eingabe von Telefonnummern.
TYPE_CLASS_TEXT
- Ein Textfeld zur Eingabe der unterstützten Zeichen.
Diese Konstanten werden in der Referenzdokumentation für
InputType
Das Feld inputType
kann andere Bits enthalten, die eine Variante des Textfelds angeben.
-Typ, zum Beispiel:
TYPE_TEXT_VARIATION_PASSWORD
- Eine Variante von
TYPE_CLASS_TEXT
zum Eingeben von Passwörtern. Die Eingabemethode wird angezeigt. Dingbats statt des eigentlichen Textes. TYPE_TEXT_VARIATION_URI
- Eine Variante von
TYPE_CLASS_TEXT
zur Eingabe von Web-URLs und anderen Uniform Resource IDs (URIs). TYPE_TEXT_FLAG_AUTO_COMPLETE
- Eine Variante von
TYPE_CLASS_TEXT
zum Eingeben von Text, der von der Anwendung automatisch aus einem Wörterbuch, einer Suche oder einer anderen Funktion vervollständigt wird.
Maskieren Sie inputType
mit der entsprechenden Konstante, wenn Sie diese Varianten testen. Die verfügbaren Maskenkonstanten sind in der Referenzdokumentation für InputType
aufgeführt.
Text an die Anwendung senden
Während der Nutzer Text mit Ihrem IME eingibt, können Sie Text an die App senden, indem Sie einzelne
Schlüsselereignisse verwenden oder den Text um den Cursor im Textfeld der Anwendung bearbeiten. In beiden Fällen
verwenden Sie eine Instanz von InputConnection
, um den Text zu übermitteln. Rufen Sie InputMethodService.getCurrentInputConnection()
auf, um diese Instanz abzurufen.
Text um den Cursor herum bearbeiten
Wenn Sie vorhandenen Text bearbeiten, sind in BaseInputConnection
folgende Methoden hilfreich:
-
getTextBeforeCursor()
- Gibt einen
CharSequence
zurück, der die Anzahl der angeforderten Zeichen vor der aktuellen Cursorposition enthält. -
getTextAfterCursor()
- Gibt ein
CharSequence
zurück, das die Anzahl der angeforderten Zeichen nach der aktuellen Cursorposition enthält. -
deleteSurroundingText()
- Löscht die angegebene Anzahl von Zeichen vor und nach der aktuellen Cursorposition.
-
commitText()
- Übermittelt eine
CharSequence
an das Textfeld und legt eine neue Cursorposition fest.
Das folgende Snippet zeigt beispielsweise, wie die vier Zeichen links vom mit dem Text „Hello!“:
Kotlin
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
Java
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
Texterstellung vor dem Commit unterstützen
Wenn Ihr IME Text vorhersagen kann oder mehrere Schritte zum Erstellen einer Glyphe oder eines Wortes erfordert, können Sie den
Fortschritt im Textfeld, bis der Nutzer das Wort festschreibt. Dann können Sie den Teil
mit dem vollständigen Text. Sie können den Text besonders formatieren, indem Sie ihm beim Übergeben an setComposingText()
einen Span hinzufügen.
Das folgende Snippet zeigt, wie der Fortschritt in einem Textfeld angezeigt wird:
Kotlin
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
Java
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
Hardware-Schlüsselereignisse abfangen
Auch wenn das Fenster der Eingabemethode keinen expliziten Fokus hat, empfängt es Hardwareschlüsselereignisse und können sie verarbeiten oder an die Anwendung weiterleiten. So können Sie beispielsweise die Richtungstasten verwenden, um während der Texterstellung auf der Benutzeroberfläche zur Auswahl von Kandidaten zu navigieren. Sie können die Zurück-Taste auch halten, um alle Dialogfelder zu schließen, die von der Eingabemethode stammen. .
Um Hardwareschlüssel abzufangen, überschreiben Sie
onKeyDown()
und
onKeyUp()
.
Rufen Sie die Methode super()
für Schlüssel auf, die Sie nicht selbst verwalten möchten.
IME-Untertyp erstellen
Mithilfe von Untertypen kann der IME mehrere Eingabemodi und Sprachen bereitstellen, die von einem IME unterstützt werden. Ein Untertyp kann stellen Sie Folgendes dar:
- Eine Sprache, z. B. „en_US“ oder „fr_FR“
- Einen Eingabemodus wie Sprache, Tastatur oder Handschrift
- Andere Eingabestile, Formulare oder Eigenschaften, die für den IME spezifisch sind, z. B. 10-Tasten oder QWERTY Tastaturlayouts
Der Modus kann aus einem beliebigen Text bestehen, z. B. „Tastatur“. oder „Stimme“. Ein Untertyp kann auch eine Kombination dieser Elemente enthalten.
Untertypinformationen werden für ein Dialogfeld zum IME-Wechsler verwendet, das in der Benachrichtigungsleiste verfügbar ist. und zu den IME-Einstellungen. Anhand dieser Informationen kann das Framework auch direkt einen bestimmten Untertyp einer IME aufrufen. Verwenden Sie beim Erstellen einer IME die Untertypfunktion, da sie Nutzern hilft, verschiedene IME-Sprachen und ‑Modi zu identifizieren und zu wechseln.
Definieren Sie Untertypen in einer der XML-Ressourcendateien der Eingabemethode mit der Methode
<subtype>
-Element. Im folgenden Code-Snippet wird eine IME mit zwei Untertypen definiert: ein Tastaturuntertyp für die US-englische Sprache und ein weiterer Tastaturuntertyp für die französische Sprache in Frankreich:
<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.softkeyboard.Settings" android:icon="@drawable/ime_icon"> <subtype android:name="@string/display_name_english_keyboard_ime" android:icon="@drawable/subtype_icon_english_keyboard_ime" android:languageTag="en-US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="somePrivateOption=true" /> <subtype android:name="@string/display_name_french_keyboard_ime" android:icon="@drawable/subtype_icon_french_keyboard_ime" android:languageTag="fr-FR" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="someVariable=30,someInternalOption=false" /> <subtype android:name="@string/display_name_german_keyboard_ime" ... /> </input-method>
Um sicherzustellen, dass Ihre Untertypen in der Benutzeroberfläche richtig beschriftet sind, verwenden Sie „%s“, um ein Untertyplabel zu erhalten, das ist mit dem Sprachlabel des Untertyps identisch. Das wird in den nächsten beiden Code-Snippets veranschaulicht. Die erstes Snippet zeigt einen Teil der XML-Datei der Eingabemethode:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
Das folgende Snippet ist Teil der strings.xml
-Datei der IME. String-Ressource
label_subtype_generic
, der von der UI-Definition für die Eingabemethode zum Festlegen des
Label des Untertyps so definiert:
<string name="label_subtype_generic">%s</string>
Diese Einstellung bewirkt, dass der Anzeigename des Untertyps mit der Spracheinstellung übereinstimmt. In einer englischsprachigen Sprache lautet der Anzeigename beispielsweise „Englisch (Vereinigte Staaten)“.
IME-Untertypen über die Benachrichtigungsleiste auswählen
Das Android-System verwaltet alle von allen Eingabemethoden-Oberflächen bereitgestellten Untertypen. IME-Untertypen werden als Modi der zugehörigen IME behandelt. Der Nutzer kann über die Benachrichtigungsleiste oder die Einstellungen zu einem Menü mit verfügbaren IME-Untertypen wechseln, wie in der folgenden Abbildung dargestellt:

IME-Untertypen in den Systemeinstellungen auswählen
Der Nutzer kann auch in den Systemeinstellungen unter Sprache und Eingabe festlegen, wie Untertypen verwendet werden:

Zwischen IME-Untertypen wechseln
Sie können Nutzern das Umschalten zwischen IME-Untertypen erleichtern, indem Sie eine Umschalttaste bereitstellen, z. B. das kugelförmige Sprachsymbol auf der Tastatur. Dies verbessert die Bedienungsfreundlichkeit der Tastatur und ist praktisch für die Nutzenden. So aktivieren Sie diese Umschaltung:
supportsSwitchingToNextInputMethod = "true"
in der XML-Datei der Eingabemethode deklarieren Ressourcendateien. Ihre Deklaration muss in etwa so aussehen:<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.softkeyboard.Settings" android:icon="@drawable/ime_icon" android:supportsSwitchingToNextInputMethod="true">
- Rufen Sie die Methode
shouldOfferSwitchingToNextInputMethod()
. - Wenn die Methode „wahr“ zurückgibt, wird ein Schalter angezeigt.
- Wenn der Nutzer auf den Schalter tippt, rufe
switchToNextInputMethod()
mit „false“ auf. Wenn der Wert „false“ ist, werden alle Untertypen unabhängig von der zugehörigen IME gleich behandelt. Wenn Sie "true" angeben, muss das System die Untertypen aktuellen IME.
Allgemeine Hinweise zu IMEs
Beachten Sie bei der Implementierung des IMEs außerdem Folgendes:
- Bieten Sie Nutzern die Möglichkeit, Optionen direkt über die Benutzeroberfläche der IME festzulegen.
- Bieten Sie Nutzern die Möglichkeit, direkt über die Benutzeroberfläche der Eingabemethode zu einer anderen Eingabemethode zu wechseln, da möglicherweise mehrere Eingabemethoden auf dem Gerät installiert sind.
- Rufen Sie die Benutzeroberfläche des IME schnell auf. Laden Sie alle großen Ressourcen vorab oder bei Bedarf, damit Nutzer die Eingabemethode sehen, sobald sie auf ein Textfeld tippen. Ressourcen und Ansichten für nachfolgende -Aufrufen der Eingabemethode.
- Geben Sie große Arbeitsspeicherzuweisungen sofort frei, nachdem das Fenster für die Eingabemethode ausgeblendet wurde, dass Anwendungen genügend Arbeitsspeicher haben, um ausgeführt zu werden. Verwenden Sie eine verzögerte Nachricht, um Ressourcen freizugeben, wenn die IME einige Sekunden lang ausgeblendet ist.
- Achten Sie darauf, dass Nutzer für die mit der IME verknüpfte Sprache oder das verknüpfte Gebietsschema möglichst viele Zeichen eingeben können. Nutzer verwenden möglicherweise Satzzeichen in Passwörtern oder Nutzernamen. Ihre IME muss daher viele verschiedene Zeichen bereitstellen, damit Nutzer ein Passwort eingeben und auf das Gerät zugreifen können.