Edytor metody wprowadzania (IME) to element sterujący, który umożliwia użytkownikowi 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ć jeden w ustawieniach systemu i używać ich w całym systemie. Można włączyć tylko jeden edytor IME naraz.
Aby dodać edytor IME do systemu Android, utwórz aplikację na Androida zawierającą klasę, która
rozciąga się
InputMethodService
Poza tym zwykle tworzysz „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 znajdują się następujące tematy:
- Cykl życia IME
- Deklarowanie komponentów IME w pliku manifestu aplikacji
- Interfejs API IME
- Projektowanie UI IME
- Wysyłanie tekstu z edytora 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:
![Obraz pokazujący cykl życia IME.](https://developer.android.com/static/resources/articles/images/inputmethod_lifecycle_image.png?hl=pl)
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.
Zadeklaruj komponenty IME w pliku manifestu
W systemie Android jest to aplikacja na Androida zawierająca specjalną usługę IME.
w pliku manifestu aplikacji musi być zadeklarowana usługa, żądanie wymaganych uprawnień,
filtr intencji, który pasuje do działania action.view.InputMethod
, i dostarcza metadane.
który określa
cechy edytora 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 deklaruje aktywność związaną z ustawieniami dla IME. Zawiera filtr intencji:
ACTION_MAIN
, które
wskazuje, że to działanie jest głównym punktem wejścia 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 specyficzne dla IME można znaleźć w tabeli
android.inputmethodservice
oraz
android.view.inputmethod
przesyłek. 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.
Ważne są również te klasy:
BaseInputConnection
-
Definiuje kanał komunikacji na podstawie
InputMethod
do aplikacji, która otrzymuje dane wejściowe. Służy on do odczytywania 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ślany przez wystąpienieKeyboard
, który można zdefiniować w pliku XML.
Projektowanie UI metody wprowadzania
W przypadku IME są dwa główne elementy wizualne: widok wejściowy widok kandydaci. 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. Implementując tę metodę, utwórz układ, który chcesz wyświetlać w IME.
i zwróci układ do systemu. Ten fragment kodu zawiera przykład implementacji
metoda 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
jest instancją niestandardowej implementacji
KeyboardView
, który renderuje wartość Keyboard
.
Widok kandydatów
Widok kandydatów to interfejs, w którym IME wyświetla potencjalne poprawki słów lub sugestie
którą użytkownik ma wybrać. 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 na temat projektowania interfejsu
W tej sekcji opisujemy wybrane aspekty projektowania UI w edytorach IME.
Obsługa różnych rozmiarów ekranu
Interfejs użytkownika edytora IME musi być w stanie skalować się do różnych rozmiarów ekranu i obsługiwać zarówno w orientacji poziomej, i orientacji pionowej. W niepełnoekranowym trybie IME zostaw wystarczającą ilość miejsca na wyświetlać pole tekstowe i powiązany z nim kontekst, tak aby nie więcej niż połowa ekranu była zajęta przez IME. 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ć edytora IME, sprawdzać, czy użytkownik wpisuje prawidłowy tekst dla tego typu danych wejściowych. To zadanie do aplikacji, która jest właścicielem pola tekstowego.
Tak na przykład wygląda interfejs Latin IME dla tekstu platformy Androida. dane wejściowe:
![Obraz przedstawiający dane wejściowe w edytorze IME łacińskiego](https://developer.android.com/static/images/ui/text_input.png?hl=pl)
A oto interfejs dostępny dla platformy Android za pomocą Latin IME. dane liczbowe:
![Obraz przedstawiający dane liczbowe na łacińskim edytorze IME](https://developer.android.com/static/images/ui/numeric_input.png?hl=pl)
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ć go pod kątem typu danych wejściowych pola tekstowego, zamaskuj go stałą
TYPE_MASK_CLASS
,
podobny do tego:
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 wpisania daty i godziny.
TYPE_CLASS_PHONE
- Pole tekstowe do wpisania numerów telefonów.
TYPE_CLASS_TEXT
- Pole tekstowe do wpisania obsługiwanych znaków.
Stałe te opisaliśmy szczegółowo w dokumentacji referencyjnej
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ł. Wyświetlana jest metoda wprowadzania zamiast faktycznego tekstu. TYPE_TEXT_VARIATION_URI
- Wariant atrybutu
TYPE_CLASS_TEXT
do wpisywania adresów URL stron internetowych i innych zasobów typu Uniform Resource Identyfikatory (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 maskuj inputType
za pomocą odpowiedniej stałej.
dostępne stałe maski znajdziesz w dokumentacji referencyjnej dla funkcji InputType
.
Wyślij tekst 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ę żądanych 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()
- Usuwa określoną liczbę 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ń dotyczących sprzętu
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ż przechwycić klawisz Wstecz, aby zamykać wszystkie okna dialogowe pochodzące z metody wprowadzania okno.
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 reprezentują następujące elementy:
- Region, np. pl_PL lub fr_FR
- trybu wprowadzania danych, takiego jak 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ż udostępniać kombinację z nich.
Informacje o podtypie są używane w oknie przełączania IME, które jest dostępne z paska powiadomień oraz ustawienia IME. Te informacje umożliwiają też platformie wyświetlenie określonego podtypu IME. bezpośrednio. Kiedy tworzysz edytor IME, używaj jego podtypu, bo ułatwia on użytkownikowi przełączać się między różnymi językami i trybami IME.
Zdefiniuj podtypy w jednym z plików zasobów XML metody wejściowej za pomocą atrybutu
<subtype>
element. Ten fragment kodu definiuje edytor IME z 2 podtypami:
podtyp klawiatury dla języka angielskiego (USA) i inny podtyp dla języka francuskiego
dla 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 tekstowy
label_subtype_generic
, która jest używana przez definicję metody wprowadzania danych w interfejsie do ustawiania
etykieta podtypu jest zdefiniowana w następujący sposób:
<string name="label_subtype_generic">%s</string>
To ustawienie powoduje, że wyświetlana nazwa podtypu jest zgodna z ustawieniem lokalnym. Na przykład w dowolnym dla języka angielskiego, wyświetlana nazwa to „English (United States)”.
Wybierz podtypy IME na pasku 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:
![Obraz przedstawiający sekcję Języki i wprowadzanie menu Systemowego](https://developer.android.com/static/images/ui/languages_and_input.png?hl=pl)
Wybierz podtypy IME w ustawieniach systemu
Użytkownik może też kontrolować sposób używania podtypów w polach Język panel ustawień wprowadzania danych w ustawieniach systemu:
![Obraz przedstawiający menu wyboru języków](https://developer.android.com/static/images/ui/languages.png?hl=pl)
Przełączanie między podtypami IME
Możesz ułatwić użytkownikom przełączanie się między podtypami IME, podając klucz przełączania, taki jak ikona 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 pliku XML metody wprowadzania plików zasobów. 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 zwraca wartość „prawda”, wyświetl klucz przełączania.
- Gdy użytkownik naciśnie klawisz przełączania, wywoła
switchToNextInputMethod()
, z wynikiem fałsz. Wartość „false” (fałsz) informuje system, że ma traktować wszystkie podtypy jednakowo, niezależnie od tego do jakiego edytora IME należą. Ustawienie wartości „true” (prawda) wymaga, aby system poruszał się między podtypami w obecnie używany edytor IME.
Ogólne uwagi na temat 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łączania się na inny edytor IME bezpośrednio z interfejsu metody wprowadzania. bo na urządzeniu może być zainstalowanych wiele edytorów IME.
- Szybko wyświetl interfejs IME. Wstępne wczytywanie lub ładowanie na żądanie dużych zasobów, aby użytkownicy i zobaczyć edytor IME od razu po dotknięciu pola tekstowego. Buforuj zasoby i widoki w pamięci podręcznej metody wprowadzania.
- Zwolnij duże przydziały pamięci natychmiast po ukryciu okna metody wprowadzania, aby że aplikacje mają 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.
- Użytkownicy powinni wpisać jak najwięcej znaków dla danego języka lub regionu. powiązane z edytorem IME. Użytkownicy mogą używać znaków interpunkcyjnych w hasłach lub nazwach użytkowników, więc Twój edytor IME musi zawierać wiele różnych znaków, aby umożliwić użytkownikom wpisanie hasła i uzyskanie dostępu do urządzenia.