Utwórz metodę wprowadzania

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:

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:

Ilustracja przedstawiająca cykl życia interfejsu IME.
Rysunek 1. 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.InputMethodoraz 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 podstawowego InputConnection.
KeyboardView
Rozszerzenie View, które renderuje klawiaturę i reaguje na zdarzenia wejściowe użytkownika. Układ klawiatury jest określony za pomocą instancji Keyboard, 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:

Ilustracja przedstawiająca wprowadzanie tekstu w klawiaturze łacińskiej
Rysunek 2. Wprowadzanie tekstu za pomocą układu metody wprowadzania tekstu w języku łacińskim.

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

Obraz przedstawiający dane liczbowe na IME łacińskiego
Rysunek 3. Klawiatura numeryczna IME w języku łacińskim.

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 CharSequencezawierają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:

Obraz przedstawiający sekcję Języki i wprowadzanie menu Systemowego
Rysunek 4. Strona Języki menu wprowadzania.

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:

Ilustracja pokazująca menu wyboru języków
Rysunek 5. Menu systemowe Języki

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:

  1. 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">
  2. Wywołaj funkcję shouldOfferSwitchingToNextInputMethod() .
  3. Jeśli metoda zwróci wartość true, wyświetl klucz przełączania.
  4. 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.