Ein Eingabemethoden-Editor (IME) ist ein Steuerelement, mit dem Nutzer Text eingeben können. Android bietet ein erweiterbares Framework für Eingabemethoden, mit dem Anwendungen Nutzern alternative Eingabemethoden wie Bildschirmtastaturen oder Spracheingabe zur Verfügung stellen können. Nach der Installation der IME-Apps kann der Nutzer in den Systemeinstellungen eine IME-App auswählen und im gesamten System verwenden. Es kann immer nur eine IME aktiviert sein.
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 „Einstellungen“-Aktivität, die Optionen an den IME-Dienst übergibt. Sie können auch eine Einstellungs-UI definieren, die als Teil der Systemeinstellungen angezeigt wird.
Auf dieser Seite werden die folgenden Themen behandelt:
- IME-Lebenszyklus
- IME-Komponenten im Anwendungsmanifest deklarieren
- IME API
- IME-Benutzeroberfläche entwerfen
- Text von einer IME an eine Anwendung senden
- Mit IME-Untertypen arbeiten
- Weitere Hinweise zur IME
Wenn Sie noch nicht mit IMEs gearbeitet haben, lesen Sie zuerst den Einführungsartikel On-Screen Input Methods.
IME-Lebenszyklus
Das folgende Diagramm beschreibt den Lebenszyklus einer IME:

In den folgenden Abschnitten wird beschrieben, wie Sie die Benutzeroberfläche und den Code für eine IME implementieren, die diesem Lebenszyklus folgt.
IME-Komponenten im Manifest deklarieren
Im Android-System ist eine IME eine Android-Anwendung, die einen speziellen IME-Dienst enthält. Im Manifest der Anwendung muss der Dienst deklariert, die erforderlichen Berechtigungen angefordert, ein Intent-Filter bereitgestellt werden, der mit der Aktion action.view.InputMethod
übereinstimmt, und Metadaten angegeben werden, die die Eigenschaften der IME definieren. Außerdem können Sie eine Einstellungsaktivität definieren, die über die Systemeinstellungen gestartet werden kann, damit der Nutzer das Verhalten der IME ändern kann.
Im folgenden Snippet wird ein IME-Dienst deklariert. Es wird die Berechtigung BIND_INPUT_METHOD
angefordert, damit der Dienst die IME mit dem System verbinden kann. Außerdem wird ein Intent-Filter eingerichtet, der mit der Aktion android.view.InputMethod
übereinstimmt, und es werden Metadaten für die 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 hat einen Intent-Filter für ACTION_MAIN
, der angibt, 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 auch direkt über die Benutzeroberfläche der IME auf die Einstellungen zugreifen.
Die API für Eingabemethoden
Klassen, die speziell für IME-Apps gelten, finden Sie in den Paketen android.inputmethodservice
und android.view.inputmethod
. Die Klasse KeyEvent
ist wichtig für die Verarbeitung von Tastaturzeichen.
Der zentrale Teil einer IME ist eine Dienstkomponente – eine Klasse, die InputMethodService
erweitert. Zusätzlich zur Implementierung des normalen Dienstlebenszyklus enthält diese Klasse Callbacks zum Bereitstellen der Benutzeroberfläche Ihrer IME, zum Verarbeiten von Nutzereingaben und zum Übermitteln von Text an das Feld, das den Fokus hat. Standardmäßig bietet die Klasse InputMethodService
die meisten Implementierungen 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 zur Anwendung, die die Eingabe empfängt. Damit können Sie Text um den Cursor herum lesen, Text in das Textfeld einfügen und Rohschlüsselereignisse an die Anwendung senden. Anwendungen müssen diese Klasse erweitern, anstatt die BasisschnittstelleInputConnection
zu implementieren. KeyboardView
-
Eine Erweiterung von
View
, die eine Tastatur rendert und auf Nutzereingabeereignisse reagiert. Das Tastaturlayout wird durch eine Instanz vonKeyboard
angegeben, die Sie in einer XML-Datei definieren können.
Benutzeroberfläche für die Eingabemethode entwerfen
Ein IME hat zwei Hauptkomponenten: die Eingabeansicht und die Vorschlagsansicht. Sie müssen nur die Elemente implementieren, die für die von Ihnen entwickelte Eingabemethode relevant sind.
Eingabeansicht
Die Eingabeansicht ist die Benutzeroberfläche, in der der Nutzer Text in Form von Tastenklicks, Handschrift oder Gesten eingibt. Wenn die IME zum ersten Mal angezeigt wird, ruft das System den onCreateInputView()
-Callback auf. Erstellen Sie in Ihrer Implementierung dieser Methode das Layout, das im IME-Fenster angezeigt werden soll, und geben Sie das Layout an das System zurück. Das folgende Snippet zeigt ein Beispiel für die Implementierung der 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 ein Keyboard
rendert.
Kandidatenansicht
Die Kandidatenansicht ist die Benutzeroberfläche, auf der die IME potenzielle Wortkorrekturen oder Vorschläge für den Nutzer anzeigt. Im IME-Lebenszyklus ruft das System onCreateCandidatesView()
auf, wenn die Kandidatenansicht angezeigt werden kann. Geben Sie in Ihrer Implementierung dieser Methode ein Layout zurück, in dem Wortvorschläge angezeigt werden, oder geben Sie „null“ zurück, wenn Sie nichts anzeigen möchten. Eine Nullantwort ist das Standardverhalten. Sie müssen dies 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 unterstützen
Die Benutzeroberfläche für Ihre IME muss für verschiedene Bildschirmgrößen skalierbar sein und sowohl das Quer- als auch das Hochformat unterstützen. Im IME-Modus ohne Vollbild sollte genügend Platz für die Anwendung vorhanden sein, um das Textfeld und den zugehörigen Kontext anzuzeigen. Das IME sollte nicht mehr als die Hälfte des Bildschirms einnehmen. Im Vollbild-IME-Modus ist das kein Problem.
Verschiedene Eingabetypen verarbeiten
In Android-Textfeldern können Sie einen bestimmten Eingabetyp festlegen, z. B. Freiformtext, Zahlen, URLs, E‑Mail-Adressen und Suchstrings. Wenn Sie eine neue IME implementieren, müssen Sie den Eingabetyp jedes Felds erkennen und die entsprechende Benutzeroberfläche dafür bereitstellen. Sie müssen Ihre IME jedoch nicht so einrichten, dass geprüft wird, ob der Nutzer gültigen Text für den Eingabetyp eingibt. Dies liegt in der Verantwortung der Anwendung, zu der das Textfeld gehört.
Hier sehen Sie beispielsweise die Schnittstelle, die die lateinische IME für die Texteingabe auf der Android-Plattform bereitstellt:

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

Wenn ein Eingabefeld den Fokus erhält und Ihre IME gestartet wird, ruft das System onStartInputView()
auf und übergibt ein EditorInfo
-Objekt, das Details zum Eingabetyp und zu anderen Attributen des Textfelds enthält. In diesem Objekt enthält das Feld inputType
den Eingabetyp des Textfelds.
Das Feld inputType
ist ein int
, das Bitmuster für verschiedene Einstellungen für den Eingabetyp enthält. Um den Eingabetyp des Textfelds zu testen, maskieren Sie ihn mit der Konstanten TYPE_MASK_CLASS
:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Das Bitmuster für den Eingabetyp kann einen von mehreren Werten haben, darunter:
TYPE_CLASS_NUMBER
- Ein Textfeld für die Eingabe von Zahlen. Wie in Abbildung 3 dargestellt, wird im Latin-IME für Felder dieses Typs ein Ziffernblock angezeigt.
TYPE_CLASS_DATETIME
- Ein Textfeld zum Eingeben von Datum und Uhrzeit.
TYPE_CLASS_PHONE
- Ein Textfeld zum Eingeben von Telefonnummern.
TYPE_CLASS_TEXT
- Ein Textfeld, in das Sie beliebige unterstützte Zeichen eingeben können.
Diese Konstanten werden in der Referenzdokumentation für InputType
ausführlicher beschrieben.
Das Feld inputType
kann andere Bits enthalten, die eine Variante des Textfeldtyps angeben, z. B.:
TYPE_TEXT_VARIATION_PASSWORD
- Eine Variante von
TYPE_CLASS_TEXT
zum Eingeben von Passwörtern. Bei der Eingabemethode werden anstelle des tatsächlichen Texts Symbole angezeigt. TYPE_TEXT_VARIATION_URI
- Eine Variante von
TYPE_CLASS_TEXT
zum Eingeben von Web-URLs und anderen Uniform Resource Identifiers (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 Konstanten, wenn Sie diese Varianten testen. Die verfügbaren Maskenkonstanten sind in der Referenzdokumentation für InputType
aufgeführt.
Text an die Anwendung senden
Wenn der Nutzer Text mit Ihrer IME eingibt, können Sie Text an die Anwendung senden, indem Sie einzelne Tastaturereignisse senden oder den Text um den Cursor im Textfeld der Anwendung bearbeiten. Verwenden Sie in beiden Fällen eine Instanz von InputConnection
, um den Text zu übermitteln. Rufen Sie InputMethodService.getCurrentInputConnection()
auf, um diese Instanz zu erhalten.
Text um den Cursor bearbeiten
Wenn Sie vorhandenen Text bearbeiten, sind die folgenden Methoden in BaseInputConnection
hilfreich:
-
getTextBeforeCursor()
- Gibt eine
CharSequence
mit der Anzahl der angeforderten Zeichen vor der aktuellen Cursorposition zurück. -
getTextAfterCursor()
- Gibt ein
CharSequence
mit der Anzahl der angeforderten Zeichen nach der aktuellen Cursorposition zurück. -
deleteSurroundingText()
- Löscht die angegebene Anzahl von Zeichen vor und nach der aktuellen Cursorposition.
-
commitText()
- Fügt ein
CharSequence
in das Textfeld ein und legt eine neue Cursorposition fest.
Im folgenden Beispiel wird gezeigt, wie die vier Zeichen links vom Cursor durch den Text „Hallo!“ ersetzt werden:
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);
Unterstützung beim Verfassen von Text vor dem Committen
Wenn Ihre IME Text vorhersagt oder mehrere Schritte zum Erstellen eines Glyphen oder Worts erforderlich sind, können Sie den Fortschritt im Textfeld anzeigen, bis der Nutzer das Wort bestätigt. Anschließend können Sie die teilweise Eingabe durch den vollständigen Text ersetzen. Sie können den Text besonders hervorheben, indem Sie ihm ein span hinzufügen, wenn Sie ihn an setComposingText()
übergeben.
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 Eingabefenster nicht explizit im Fokus steht, empfängt es zuerst Hardware-Tastaturereignisse und kann sie verarbeiten oder an die Anwendung weiterleiten. Sie möchten beispielsweise die Richtungstasten verwenden, um während der Eingabe in Ihrer Benutzeroberfläche zur Auswahl von Vorschlägen zu navigieren. Möglicherweise möchten Sie auch die Zurück-Taste abfangen, um alle Dialogfelder zu schließen, die aus dem Eingabemethodenfenster stammen.
Wenn Sie Hardwaretasten abfangen möchten, überschreiben Sie onKeyDown()
und onKeyUp()
.
Rufen Sie die Methode super()
für Schlüssel auf, die Sie nicht selbst verarbeiten möchten.
IME-Untertyp erstellen
Mit Untertypen kann die IME mehrere Eingabemodi und Sprachen verfügbar machen, die von einer IME unterstützt werden. Ein Untertyp kann Folgendes darstellen:
- Ein Gebietsschema, z. B. en_US oder fr_FR
- Eine Eingabemethode, z. B. Sprache, Tastatur oder Handschrift
- Andere Eingabestile, Formulare oder Eigenschaften, die für die IME spezifisch sind, z. B. 10-Tasten- oder QWERTY-Tastaturlayouts
Der Modus kann beliebiger Text sein, z. B. „Tastatur“ oder „Sprache“. Ein Untertyp kann auch eine Kombination dieser Elemente enthalten.
Untertypinformationen werden für ein IME-Umschaltfeld verwendet, das über die Benachrichtigungsleiste verfügbar ist, und für IME-Einstellungen. Anhand der Informationen kann das Framework auch direkt einen bestimmten IME-Subtyp aufrufen. Verwenden Sie beim Erstellen eines IME die Untertypfunktion, da sie dem Nutzer hilft, zwischen verschiedenen IME-Sprachen und ‑Modi zu wechseln.
Definieren Sie Untertypen in einer der XML-Ressourcendateien der Eingabemethode mit dem Element <subtype>
. Im folgenden Code-Snippet wird eine IME mit zwei Untertypen definiert: ein Tastaturuntertyp für das Gebietsschema „US-Englisch“ und ein weiterer Tastaturuntertyp für das Gebietsschema „Französisch“ für 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>
Damit Ihre Untertypen in der Benutzeroberfläche richtig gekennzeichnet werden, verwenden Sie `%s`, um ein Untertyplabel abzurufen, das mit dem Gebietsschemalabel des Untertyps übereinstimmt. Das wird in den nächsten beiden Code-Snippets veranschaulicht. Das erste 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 nächste Snippet ist Teil der strings.xml
-Datei des IME. Die String-Ressource label_subtype_generic
, die von der UI-Definition der Eingabemethode verwendet wird, um das Label des Untertyps festzulegen, ist so definiert:
<string name="label_subtype_generic">%s</string>
Mit dieser Einstellung wird der Anzeigename des Subtyps an die Spracheinstellung angepasst. In allen englischen Gebietsschemas lautet der Anzeigename beispielsweise „Englisch (USA)“.
IME-Untertypen über die Benachrichtigungsleiste auswählen
Das Android-System verwaltet alle Untertypen, die von allen IME-Apps bereitgestellt werden. IME-Untertypen werden als Modi des IME behandelt, zu dem sie gehören. Der Nutzer kann über die Benachrichtigungsleiste oder die Einstellungen zu einem Menü mit verfügbaren IME-Untertypen navigieren, wie in der folgenden Abbildung dargestellt:

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

Zwischen IME-Untertypen wechseln
Sie können Nutzern das einfache Wechseln zwischen IME-Untertypen ermöglichen, indem Sie eine Umschalttaste wie das globusförmige Sprachsymbol auf der Tastatur bereitstellen. Das verbessert die Bedienbarkeit der Tastatur und ist für den Nutzer praktisch. So aktivieren Sie das Umschalten:
- Deklarieren Sie
supportsSwitchingToNextInputMethod = "true"
in den XML-Ressourcendateien der Eingabemethode. 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()
auf. - Wenn die Methode „true“ zurückgibt, zeigen Sie einen Umschalt-Schlüssel an.
- Wenn der Nutzer auf den Umschalt-Schlüssel tippt, rufen Sie
switchToNextInputMethod()
auf und übergeben Sie „false“. Bei einem Wert von „false“ werden alle Untertypen gleich behandelt, unabhängig davon, zu welcher IME sie gehören. Wenn Sie „true“ angeben, muss das System die Untertypen in der aktuellen IME durchlaufen.
Allgemeine Hinweise zur IME
Hier sind weitere Punkte, die Sie bei der Implementierung Ihrer IME beachten sollten:
- 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 IME zu wechseln, da möglicherweise mehrere IMEs auf dem Gerät installiert sind.
- IME-Benutzeroberfläche schnell aufrufen Laden Sie alle großen Ressourcen vorab oder bei Bedarf, damit Nutzer die IME sehen, sobald sie auf ein Textfeld tippen. Ressourcen und Ansichten für nachfolgende Aufrufe der Eingabemethode im Cache speichern.
- Geben Sie große Arbeitsspeicherzuweisungen sofort frei, nachdem das Eingabemethodenfenster ausgeblendet wurde, damit Anwendungen genügend Arbeitsspeicher für die Ausführung haben. Verwenden Sie eine verzögerte Nachricht, um Ressourcen freizugeben, wenn die IME einige Sekunden lang ausgeblendet ist.
- Achten Sie darauf, dass Nutzer so viele Zeichen wie möglich für die Sprache oder das Gebietsschema eingeben können, das mit der IME verknüpft ist. Nutzer verwenden möglicherweise Satzzeichen in Passwörtern oder Nutzernamen. Daher muss Ihre IME viele verschiedene Zeichen bereitstellen, damit Nutzer ein Passwort eingeben und auf das Gerät zugreifen können.