Eingabemethode erstellen

Ein Eingabemethodeneditor (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.

Um dem Android-System einen IME hinzuzufügen, erstellen Sie eine Android-App mit einer Klasse, die erweitert InputMethodService Darüber hinaus erstellen Sie in der Regel Aktivität, bei der Optionen an den IME-Dienst übergeben werden. 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:

Wenn Sie noch nicht mit IMEs gearbeitet haben, lesen Sie den einführenden Artikel. Eingabemethoden auf dem Bildschirm .

<ph type="x-smartling-placeholder">

IME-Lebenszyklus

Im folgenden Diagramm wird der Lebenszyklus eines IME beschrieben:

<ph type="x-smartling-placeholder">
</ph> Ein Bild, das den Lebenszyklus eines IME zeigt. <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Der Lebenszyklus eines IME.

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 ein IME eine Android-App, die einen speziellen IME-Dienst enthält. Die In der Manifestdatei der Anwendung muss der Dienst deklariert, die erforderlichen Berechtigungen angefordert und eine Intent-Filter, der der Aktion action.view.InputMethod entspricht, und Metadaten angeben der die Eigenschaften des IME definiert. 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>

Das nächste Snippet deklariert die Einstellungsaktivität für den IME. 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 verfügt über Callbacks für die Bereitstellung der Benutzeroberfläche Ihres IME, die Verarbeitung von Nutzereingaben und die Übermittlung von Text an den das Fokus hat. Standardmäßig stellt die Klasse InputMethodService die meisten der Implementierung zur Verwaltung des Status und der Sichtbarkeit des IME und zur Kommunikation mit dem aktuellen Eingabefeld.

Die folgenden Klassen sind ebenfalls wichtig:

BaseInputConnection
Definiert den Kommunikationskanal von einer InputMethod zu der Anwendung, die ihre Eingaben empfängt. Sie können damit Text um die Cursor, übergeben Sie Text im Textfeld und senden Sie unverarbeitete Schlüsselereignisse an die Anwendung. Anwendungen müssen diese Klasse erweitern, anstatt die Basisschnittstelle zu implementieren InputConnection
KeyboardView
Eine Erweiterung von View, die Rendert eine Tastatur und reagiert auf Nutzereingaben. Das Tastaturlayout wird durch einen Instanz von Keyboard, die Sie in einer XML-Datei definieren können.

UI für Eingabemethoden 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 der IME zum ersten Mal angezeigt wird, ruft das System die onCreateInputView() Callback des Nutzers an. 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

Die Kandidatenansicht ist die Benutzeroberfläche, auf der der IME potenzielle Wortkorrekturen oder Vorschläge anzeigt die der Nutzer auswählen kann. Im IME-Lebenszyklus ruft das System onCreateCandidatesView() wenn sie bereit ist, die Kandidatenansicht anzuzeigen. Bei der Implementierung dieser Methode wird ein Layout mit Wortvorschlägen oder gibt null zurück, wenn Sie nichts anzeigen möchten. Ein Nullwert Antwort ist das Standardverhalten. Sie müssen dies also nicht implementieren, wenn Sie Vorschläge machen.

Überlegungen zum UI-Design

In diesem Abschnitt werden einige Überlegungen zum UI-Design für IMEs beschrieben.

Mehrere Bildschirmgrößen verarbeiten

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. Wenn der IME-Modus nicht im Vollbildmodus angezeigt wird, lassen Sie genügend Platz für die App, das Textfeld und den zugehörigen Kontext anzeigen, sodass nicht mehr als die Hälfte des Bildschirms von den IME. Im IME-Vollbildmodus 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:

<ph type="x-smartling-placeholder">
</ph> Ein Bild, das eine Texteingabe auf einem lateinischen IME zeigt <ph type="x-smartling-placeholder">
</ph> Abbildung 2: Texteingabe für lateinischen IME

Hier ist die Schnittstelle, die der Latin IME für die Android-Plattform bereitstellt. numerische Eingabe:

<ph type="x-smartling-placeholder">
</ph> Ein Bild, das eine numerische Eingabe auf einem lateinischen IME zeigt <ph type="x-smartling-placeholder">
</ph> Abbildung 3: Numerische Eingabe des lateinischen IME

Wenn ein Eingabefeld den Fokus erhält und der IME gestartet wird, ruft das System onStartInputView(), Übergabe an EditorInfo-Objekt mit Details zum Eingabetyp und anderen Attributen des Textfelds. 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, wird beim lateinischen IME ein Ziffernblock für Felder dieses Typs.
TYPE_CLASS_DATETIME
Ein Textfeld für die Eingabe von Datum und Uhrzeit.
TYPE_CLASS_PHONE
Ein Textfeld zur Eingabe von Telefonnummern.
TYPE_CLASS_TEXT
Ein Textfeld zur Eingabe der unterstützten Zeichen.

Diese Konstanten sind 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 zur Eingabe 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 für die Eingabe von Text, den die Anwendung automatische Vervollständigungen aus einem Wörterbuch, einer Suche oder einer anderen Einrichtung.

Maskieren Sie inputType mit der entsprechenden Konstante, wenn Sie diese Varianten testen. Die Die verfügbaren Maskenkonstanten finden Sie in der Referenzdokumentation zu InputType.

<ph type="x-smartling-placeholder">

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 zum Abrufen dieser Instanz InputMethodService.getCurrentInputConnection()

Text um den Cursor herum bearbeiten

Wenn Sie vorhandenen Text bearbeiten, stehen Ihnen einige nützliche Methoden in BaseInputConnection sind die folgenden:

getTextBeforeCursor()
Gibt ein CharSequence zurück mit der Anzahl der angeforderten Zeichen vor der aktuellen Cursorposition.
getTextAfterCursor()
Gibt ein CharSequence mit der Anzahl der angeforderten Zeichen zurück, die auf auf die aktuelle Cursorposition.
deleteSurroundingText()
Löscht die angegebene Anzahl von Zeichen vor und nach der aktuellen Cursorposition.
commitText()
Übermittelt ein 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 dem Text eine Sonderbehandlung verleihen, indem Sie span übergeben, wenn Sie ihn an setComposingText()

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. Vielleicht möchten Sie verwenden Sie die Pfeiltasten, um innerhalb Ihrer Benutzeroberfläche für die Kandidatenauswahl während der Erstellung 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 von diesen.

Untertypinformationen werden für ein Dialogfeld zum IME-Wechsler verwendet, das in der Benachrichtigungsleiste verfügbar ist. und zu den IME-Einstellungen. Mit diesen Informationen kann das Framework auch einen bestimmten Untertyp eines IME aufrufen. . Verwenden Sie beim Erstellen eines IMEs für den Untertyp die Einrichtung für den Subtyp. zwischen verschiedenen IME-Sprachen und -Modi wechseln.

Definieren Sie Untertypen in einer der XML-Ressourcendateien der Eingabemethode mit der Methode <subtype>-Element. Im folgenden Code-Snippet wird ein IME mit zwei Untertypen definiert: Tastaturuntertyp für Englisch (USA) und ein weiterer Tastatur-Untertyp für Französisch Sprache 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>

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. Dies wird in den nächsten beiden Code-Snippets gezeigt. 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 nächste Snippet ist Teil der strings.xml-Datei des 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. Zum Beispiel Englische Sprache angezeigt wird, ist der Anzeigename „Englisch (USA)“.

IME-Untertypen in der Benachrichtigungsleiste auswählen

Das Android-System verwaltet alle von allen IMEs bereitgestellten Untertypen. IME-Untertypen werden als Modi zu welchem IME sie gehören. Der Nutzer kann von der Benachrichtigungsleiste oder der App „Einstellungen“ zu einem der verfügbaren IME-Untertypen aus, wie in der folgenden Abbildung dargestellt:

<ph type="x-smartling-placeholder">
</ph> Ein Bild, auf dem die Sprachen und Systemmenü zur Eingabe <ph type="x-smartling-placeholder">
</ph> Abbildung 4: Das Menü Sprachen und Systemmenüs.

IME-Untertypen in den Systemeinstellungen auswählen

Der Nutzer kann zudem steuern, wie Untertypen verwendet werden, indem er im Bereich Sprache & im Bereich „Eingabeeinstellungen“ in den Systemeinstellungen:

<ph type="x-smartling-placeholder">
</ph> Ein Bild, auf dem das Menü für die Sprachauswahl zu sehen ist <ph type="x-smartling-placeholder">
</ph> Abbildung 5: Das Systemmenü Sprachen

Zwischen IME-Untertypen wechseln

Mit einem Schlüssel wie dem kugelförmiges Sprachsymbol auf der Tastatur. Dies verbessert die Bedienungsfreundlichkeit der Tastatur und ist praktisch für die Nutzenden. So aktivieren Sie den Wechsel:

  1. 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">
    
  2. Rufen Sie die Methode shouldOfferSwitchingToNextInputMethod() .
  3. Wenn die Methode „true“ zurückgibt, zeigen Sie einen Wechselschlüssel an.
  4. Wenn der Nutzer auf die Taste zum Wechseln tippt, switchToNextInputMethod(), mit "false" übergeben wird. Der Wert „false“ weist das System an, alle Untertypen unabhängig von zu welchem IME sie gehören. 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:

  • Nutzern die Möglichkeit geben, Optionen direkt über die Benutzeroberfläche des IME festzulegen
  • Bieten Sie Nutzern die Möglichkeit, über die Benutzeroberfläche der Eingabemethode zu einem anderen IME zu wechseln. da auf dem Gerät möglicherweise mehrere IMEs installiert sind.
  • Rufen Sie die Benutzeroberfläche des IME schnell auf. Große Ressourcen vorab laden oder on demand laden, sehen sie den IME, 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. Verzögerte Nachricht verwenden, um Ressourcen freizugeben wenn der IME für einige Sekunden ausgeblendet ist.
  • Nutzer sollten so viele Zeichen wie möglich für die Sprache oder das Gebietsschema eingeben können die mit dem IME verknüpft ist. Nutzer verwenden möglicherweise Satzzeichen in Passwörtern oder Nutzernamen. Ihr IME muss viele verschiedene Zeichen enthalten, damit Nutzer ein Passwort eingeben und auf das .