Utwórz metodę wprowadzania

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:

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.
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.

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 podstawowego InputConnection
KeyboardView
Rozszerzenie View, które renderuje klawiaturę i reaguje na zdarzenia wejściowe użytkownika. Układ klawiatury jest określany przez wystąpienie Keyboard, 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
Rysunek 2. Wprowadzanie tekstu w edytorze łacińskim IME.

A oto interfejs dostępny dla platformy Android za pomocą Latin IME. dane liczbowe:

Obraz przedstawiający dane liczbowe na łacińskim edytorze IME
Rysunek 3. Kodowanie liczbowe IME dla alfabetu łacińskiego.

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
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 polach Język panel ustawień wprowadzania danych w ustawieniach systemu:

Obraz przedstawiający menu wyboru języków
Rysunek 5. Menu systemowe Języki

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:

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