Edytor metody wprowadzania (IME) to element sterujący, który umożliwia użytkownikom wpisywanie tekstu. Android zapewnia rozszerzoną platformę metod wprowadzania danych, która umożliwia aplikacjom udostępnianie użytkownikom alternatywnych metod wprowadzania, np. klawiatury ekranowej lub rozpoznawania mowy. Po zainstalowaniu IME użytkownik może wybrać go w ustawieniach systemu i używać w całym systemie. Można włączyć tylko jeden edytor IME naraz.
Aby dodać metodę IME do systemu Androida, utwórz aplikację na Androida zawierającą klasę rozszerzającą InputMethodService
.
Dodatkowo zwykle tworzysz aktywność „ustawienia”, która przekazuje opcje do usługi IME. Ty
mogą też zdefiniować interfejs ustawień, który będzie się wyświetlać w ramach ustawień systemu.
Na tej stronie znajdziesz te informacje:
- Cykl życia IME
- Deklarowanie komponentów IME w pliku manifestu aplikacji
- Interfejs API IME
- Projektowanie interfejsu IME
- Wysyłanie tekstu z klawiatury IME do aplikacji
- Praca z podtypami IME
- Inne uwagi na temat IME
Jeśli nie znasz jeszcze edytorów IME, przeczytaj artykuł wprowadzający Metody wprowadzania na ekranie .
Cykl życia IME
Poniższy diagram przedstawia cykl życia IME:

W sekcjach poniżej opisujemy, jak wdrożyć interfejs użytkownika i kod powiązany z edytorem IME, który które są zgodne z tym cyklem życia.
Deklarowanie komponentów IME w pliku manifestu
W systemie Android interfejs IME to aplikacja na Androida, która zawiera specjalną usługę IME. Plik manifestu aplikacji musi deklarować usługę, prosić o wymagane uprawnienia, podawać filtr intencji pasujący do działania action.view.InputMethod
oraz metadane określające cechy IME. Aby mieć dostęp do interfejsu ustawień, który umożliwia
użytkownik zmodyfikuje działanie IME, możesz zdefiniować „ustawienia” aktywność, która może zostać uruchomiona
Ustawienia systemu.
Ten fragment deklaruje usługę IME. Prosi o uprawnienia
BIND_INPUT_METHOD
aby umożliwić usłudze połączenie IME z systemem, konfiguruje filtr intencji pasujący do działania
android.view.InputMethod
i określa metadane dla IME:
<!-- 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>
Następny fragment kodu deklaruje aktywność ustawień dla IME. Zawiera ona filtr intencji ACTION_MAIN
, który wskazuje, że ta aktywność jest głównym punktem wejścia do aplikacji IME:
<!-- 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>
Możesz też przyznać dostęp do ustawień IME bezpośrednio z jego interfejsu.
Interfejs API metody wprowadzania
Klasy przeznaczone do IME znajdziesz w pakietach android.inputmethodservice
i android.view.inputmethod
. Zajęcia KeyEvent
to
są ważne przy obsłudze znaków na klawiaturze.
Centralną częścią IME jest komponent usługi – klasa, która rozszerza
InputMethodService
Oprócz wdrożenia normalnego cyklu życia usługi ta funkcja
klasa ma wywołania zwrotne do udostępniania interfejsu IME, obsługi danych wejściowych użytkownika i dostarczania tekstu do
w którym chcemy się skupić. Domyślnie klasa InputMethodService
dostarcza większość funkcji
zarządzania stanem i widocznością edytora IME oraz komunikowanie się z obecnymi
pola do wprowadzania danych.
Te zajęcia są też ważne:
BaseInputConnection
- Określa kanał komunikacji z poziomu
InputMethod
do aplikacji, która otrzymuje dane wejściowe. Umożliwia odczytywanie tekstu wokół kursor, zatwierdź tekst w polu tekstowym i wyślij do aplikacji nieprzetworzone kluczowe zdarzenia. Aplikacje muszą rozszerzać tę klasę, a nie implementować interfejsu podstawowegoInputConnection
. KeyboardView
-
Rozszerzenie
View
, które renderuje klawiaturę i reaguje na zdarzenia wejściowe użytkownika. Układ klawiatury jest określony za pomocą instancjiKeyboard
, którą można zdefiniować w pliku XML.
Projektowanie UI metody wprowadzania
Istnieją 2 główne elementy wizualne IME: widok wprowadzania i widok kandydatów. Wystarczy wdrożyć tylko te elementy, które są istotne dla zaprojektowaną przez Ciebie metodę wprowadzania danych.
Widok danych wejściowych
Widok danych wejściowych to interfejs, w którym użytkownik wpisuje tekst, stosując kliknięcia klawiszy, pismo odręczne lub
gestami. Po pierwszym wyświetleniu edytora IME system wywołuje metodę
onCreateInputView()
oddzwanianie. W ramach implementacji tej metody utwórz układ, który ma być wyświetlany w oknie IME, i zwróć go do systemu. Ten fragment kodu pokazuje przykład implementacji metody 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; }
W tym przykładzie MyKeyboardView
to instancja niestandardowej implementacji funkcji KeyboardView
, która renderuje element Keyboard
.
Widok Kandydaci
Widok kandydatów to interfejs, w którym IME wyświetla potencjalne poprawki lub sugestie słów do wybrania przez użytkownika. W cyklu życia IME system wywołuje
onCreateCandidatesView()
gdy będzie można wyświetlić widok kandydatów. W swojej implementacji tej metody zwracaj błąd
który pokazuje sugestie słów, lub zwraca wartość null, jeśli nie chcesz niczego wyświetlać. Wartość null
jest zachowaniem domyślnym, więc nie musisz go implementować, jeśli nie podasz
sugestie.
Uwagi dotyczące projektowania interfejsu
W tej sekcji opisano niektóre kwestie związane z projektowaniem interfejsu użytkownika w przypadku interfejsów IME.
Obsługa wielu rozmiarów ekranu
Interfejs IME musi się skalować do różnych rozmiarów ekranu i działać w orientacji poziomej i pionowej. W trybie IME niepełnoekranowym pozostaw wystarczająco dużo miejsca na pole tekstowe i wszelkie powiązane konteksty, tak aby IME zajmowało nie więcej niż połowę ekranu. W trybie pełnoekranowym nie jest to problemem.
Obsługa różnych typów danych wejściowych
W polach tekstowych Androida możesz ustawić określony typ danych, na przykład dowolny tekst, liczby, adresy URL, adresów e-mail i wyszukiwanych ciągów znaków. Przy wdrażaniu nowego edytora IME wykrywaj typ danych wejściowych każdego z nich. i udostępnić odpowiedni interfejs. Nie musisz jednak konfigurować IME, aby sprawdzić, czy użytkownik wpisuje prawidłowy tekst dla danego typu danych wejściowych. To zadanie do aplikacji, która jest właścicielem pola tekstowego.
Oto na przykład interfejs, który zapewnia układ klawiatury łacińskiej na platformie Android do wprowadzania tekstu:

A tutaj interfejs, który zapewnia klawiatura IME dla języka łacińskiego na platformie Android:

Po zaznaczeniu pola do wprowadzania danych i uruchomieniu edytora IME system wywołuje
onStartInputView()
,
zaliczanie
EditorInfo
obiekt
który zawiera szczegółowe informacje o typie danych wejściowych i innych atrybutach pola tekstowego. W tym obiekcie
inputType
zawiera typ danych wejściowych pola tekstowego.
Pole inputType
to pole int
, które zawiera wzorce bitowe dla różnych
typu danych wejściowych. Aby przetestować typ danych pola tekstowego, zamaskuj go za pomocą stałej TYPE_MASK_CLASS
, na przykład:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Wzorzec bitowy typu wejściowego może mieć jedną z kilku wartości, w tym:
TYPE_CLASS_NUMBER
- Pole tekstowe do wpisywania numerów. Jak widać na rys. 3, Latin IME wyświetla klawiaturę numeryczną dla pól tego typu.
TYPE_CLASS_DATETIME
- Pole tekstowe do wpisywania daty i godziny.
TYPE_CLASS_PHONE
- Pole tekstowe do wpisania numerów telefonów.
TYPE_CLASS_TEXT
- Pole tekstowe do wpisywania dowolnych obsługiwanych znaków.
Te stałe są opisane bardziej szczegółowo w dokumentacji referencyjnej dotyczącej InputType
.
Pole inputType
może zawierać inne bity wskazujące wariant pola tekstowego
typ, na przykład:
TYPE_TEXT_VARIATION_PASSWORD
- Wariant
TYPE_CLASS_TEXT
do wpisywania haseł. Metoda wprowadzania wyświetla dingbats zamiast rzeczywistego tekstu. TYPE_TEXT_VARIATION_URI
- Wariant
TYPE_CLASS_TEXT
do wpisywania adresów URL i innych identyfikatorów URI. TYPE_TEXT_FLAG_AUTO_COMPLETE
- Wariant języka
TYPE_CLASS_TEXT
do wpisywania tekstu, który aplikacja funkcji autouzupełniania ze słownika, wyszukiwarki lub innej usługi.
Podczas testowania tych wariantów zamaskuj zmienną inputType
odpowiednią stałą. Dostępne stałe maski są wymienione w dokumentacji referencyjnej funkcji InputType
.
Wysyłanie tekstu do aplikacji
Kiedy użytkownik wpisuje tekst za pomocą IME, możesz wysyłać tekst do aplikacji, wysyłając własną
kluczowych zdarzeń lub przez edycję tekstu wokół kursora w polu tekstowym aplikacji. W obu przypadkach
użyj wystąpienia InputConnection
do przekazania tekstu. Aby pobrać tę instancję, wywołaj
InputMethodService.getCurrentInputConnection()
Edytowanie tekstu wokół kursora
Do edytowania istniejącego tekstu możesz użyć kilku przydatnych metod
BaseInputConnection
to:
-
getTextBeforeCursor()
- Zwraca
CharSequence
zawierający liczbę znaków przed bieżącą pozycją kursora. -
getTextAfterCursor()
- Zwraca wartość
CharSequence
zawierającą liczbę żądanych znaków następujących po w bieżącej pozycji kursora. -
deleteSurroundingText()
- Usuwanie określonej liczby znaków przed bieżącą pozycją kursora i po niej.
-
commitText()
- Przypisuje element
CharSequence
do pola tekstowego i ustawia nową pozycję kursora.
Na przykład ten fragment pokazuje, jak zastąpić 4 znaki po lewej stronie pola kursor z tekstem „Cześć!”:
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);
Ułatw tworzenie tekstu przed zatwierdzeniem
Jeśli edytor IME przewiduje tekst lub wymaga wielu kroków do utworzenia glifu lub słowa, możesz wyświetlić
w polu tekstowym, dopóki użytkownik nie zatwierdzi słowa. Następnie możesz zastąpić fragment
kompozycję z gotowym tekstem. Możesz nadać tekstowi szczególnego charakteru, dodając do niego
span, gdy przekażesz go do
setComposingText()
Ten fragment kodu pokazuje, jak wyświetlić postęp w polu tekstowym:
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);
Przechwytywanie kluczowych zdarzeń sprzętowych
Mimo że okno metody wprowadzania nie jest wyraźnie zaznaczone, otrzymuje kluczowe zdarzenia sprzętowe i można je przetwarzać oraz przekazywać do aplikacji. Możesz na przykład naciskaj klawisze kierunkowe, aby poruszać się po interfejsie i wybierać kandydatów podczas tworzenia kompozycji. Możesz też zablokować klawisz Wstecz, aby zamknąć wszystkie okna dialogowe pochodzące z okna metody wprowadzania.
Aby przechwytywać klucze sprzętowe, zastąp
onKeyDown()
oraz
onKeyUp()
Wywołaj metodę super()
w przypadku kluczy, których nie chcesz obsługiwać samodzielnie.
Tworzenie podtypu IME
Dzięki podtypom edytor IME może wyświetlać wiele trybów wprowadzania i języków obsługiwanych przez dany edytor. Podtyp może reprezentować:
- Region, np. pl_PL lub fr_FR
- tryb wprowadzania, np. głos, klawiatura lub pismo odręczne;
- inne style, formularze lub właściwości specyficzne dla IME, takie jak 10-klawiszowa lub QWERTY. układy klawiatury
Tryb może być dowolnym tekstem, np. „klawiatura”. lub „głos”. Podtyp może też zawierać kombinację tych typów.
Informacje o podtypie są używane w oknie przełączania IME, które jest dostępne z paska powiadomień oraz ustawienia IME. Informacje te umożliwiają też frameworkowi wyświetlenie konkretnego podtypu IME bezpośrednio. Podczas tworzenia IME użyj funkcji podtypu, ponieważ pomaga ona użytkownikowi rozpoznawać różne języki i tryby IME oraz przełączać się między nimi.
Zdefiniuj podtypy w jednym z plików zasobów XML metody wejściowej za pomocą atrybutu
<subtype>
element. Ten fragment kodu definiuje IME z 2 podtypami: podtyp klawiatury dla języka angielskiego (USA) i podtyp klawiatury dla języka francuskiego we Francji:
<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>
Aby mieć pewność, że podtypy są prawidłowo oznaczone w interfejsie, użyj parametru „%s”, aby uzyskać etykietę podtypu, która jest taka sama jak etykieta języka podtypu. Dowiesz się o tym w kolejnych 2 kolejnych fragmentach kodu. Pierwszy fragment kodu pokazuje część pliku XML metody wprowadzania:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
Następny fragment jest częścią pliku strings.xml
IME. Zasób ciągu tekstowego label_subtype_generic
, który jest używany przez definicję interfejsu metody wprowadzania do ustawienia etykiety podtypu, jest zdefiniowany w ten sposób:
<string name="label_subtype_generic">%s</string>
To ustawienie powoduje, że wyświetlana nazwa podtypu jest zgodna z ustawieniem języka. Na przykład w przypadku dowolnej wersji językowej języka angielskiego wyświetlana nazwa to „English (United States)”.
Wybieranie podtypów metody wprowadzania za pomocą okna powiadomień
System Android zarządza wszystkimi podtypami udostępnianymi przez wszystkie edytory IME. Podtypy IME są traktowane jako tryby IME, do którego należą. Użytkownik może przejść z paska powiadomień lub aplikacji Ustawienia do dostępnych podtypów IME, jak na ilustracji:

Wybierz podtypy IME w ustawieniach systemu
Użytkownik może też kontrolować sposób używania podtypów w panelu ustawień Język i wprowadzanie w ustawieniach systemu:

Przełączanie między podtypami IME
Możesz umożliwić użytkownikom łatwe przełączanie się między typami IME, udostępniając klawisz przełączania, np. ikonę języka w kształcie kuli ziemskiej na klawiaturze. Zwiększa to użyteczność klawiatury i jest wygodniejsze dla użytkownika. Aby włączyć tę funkcję, wykonaj te czynności:
- Zadeklaruj
supportsSwitchingToNextInputMethod = "true"
w plikach zasobów XML metody wprowadzania. Deklaracja musi wyglądać podobnie do tego fragmentu kodu:<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">
- Wywołaj funkcję
shouldOfferSwitchingToNextInputMethod()
. - Jeśli metoda zwróci wartość true, wyświetl klucz przełączania.
- Gdy użytkownik kliknie klawisz przełączania, wywołaj funkcję
switchToNextInputMethod()
, przekazując wartość false. Wartość fałsz wskazuje, że system ma traktować wszystkie podtypy w ten sam sposób, niezależnie od tego, do jakiego IME należą. Ustawienie wartości „true” (prawda) wymaga, aby system poruszał się między podtypami w obecnie używany edytor IME.
Ogólne uwagi dotyczące IME
Oto co jeszcze musisz wziąć pod uwagę podczas implementacji IME:
- Zapewnij użytkownikom możliwość ustawiania opcji bezpośrednio w interfejsie IME.
- Zapewnij użytkownikom możliwość przełączenia się na inną metodę wprowadzania bezpośrednio w interfejsie metody wprowadzania, ponieważ na urządzeniu może być zainstalowanych kilka metod.
- Szybkie wyświetlanie interfejsu IME. Wstępne wczytywanie dużych zasobów lub wczytywanie ich na żądanie, aby użytkownicy widzieli IME, gdy tylko klikną pole tekstowe. Buforowanie zasobów i widoków na potrzeby kolejnych wywołań metody wprowadzania.
- zwalniać duże alokacje pamięci zaraz po ukryciu okna metody wprowadzania, aby aplikacje miały wystarczającą ilość pamięci do działania. Używanie opóźnionej wiadomości do zwalniania zasobów jeśli edytor IME jest ukryty na kilka sekund.
- Upewnij się, że użytkownicy mogą wpisywać jak najwięcej znaków w języku lub regionie powiązanym z IME. Użytkownicy mogą używać znaków interpunkcyjnych w hasłach lub nazwach użytkowników, dlatego Twoja klawiatura IME musi zawierać wiele różnych znaków, aby umożliwić użytkownikom wpisywanie hasła i dostęp do urządzenia.