建立輸入法

輸入法編輯器 (IME) 是一種使用者控制項,可讓使用者輸入文字。Android 提供 可擴充的輸入法架構,能讓應用程式為使用者提供其他輸入法。 例如螢幕小鍵盤或語音輸入安裝 IME 後,使用者即可從 並在整個系統中使用一次只能啟用一個輸入法編輯器。

如要在 Android 系統中新增輸入法編輯器,請建立 Android 應用程式,並加入能 延伸 InputMethodService。 此外,您通常會建立「設定」將選項傳送到輸入法編輯器服務的活動。個人中心 也可以定義顯示在系統設定中的設定使用者介面。

本頁面涵蓋下列主題:

如果您尚未使用輸入法編輯器,請閱讀簡介文章 畫面上的輸入法 首先。

輸入法編輯器生命週期

下圖說明輸入法編輯器的生命週期:

顯示輸入法編輯器生命週期的圖片。
圖 1. 輸入法編輯器的生命週期。

以下各節說明如何實作與 依循這個生命週期

在資訊清單中宣告輸入法編輯器元件

在 Android 系統中,輸入法編輯器是內含特殊輸入法編輯器服務的 Android 應用程式。 應用程式的資訊清單檔案必須宣告服務、要求必要權限、提供 符合「action.view.InputMethod」動作的意圖篩選器,並提供中繼資料 定義輸入法編輯器的特性此外,為了提供設定介面,讓 使用者修改輸入法編輯器的行為時,您可以定義「設定」可以從中啟動 系統設定。

下列程式碼片段宣告輸入法編輯器服務。應用程式會要求權限 BIND_INPUT_METHOD 為了讓服務將輸入法編輯器連結至系統,請設定符合動作的意圖篩選器 android.view.InputMethod,以及定義輸入法編輯器的中繼資料:

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

下一段程式碼片段會宣告輸入法編輯器的設定活動。其中包含 ACTION_MAIN 符合 表示此活動是輸入法編輯器應用程式的主要進入點:

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

您也可以直接透過 UI 存取輸入法編輯器設定。

輸入法 API

輸入法編輯器適用的類別位於 android.inputmethodserviceandroid.view.inputmethod 套件KeyEvent 類別為 因為處理鍵盤字元至關重要

輸入法編輯器的中央部分是服務元件,也就是 InputMethodService。除了實作正常服務生命週期之外,這也 類別具有回呼,可提供輸入法編輯器的 UI、處理使用者輸入內容,並將文字傳送至 成為焦點根據預設,InputMethodService 類別可提供大部分的 管理輸入法編輯器狀態和可見性,以及與目前使用者通訊的 輸入欄位

下列類別也很重要:

BaseInputConnection
定義來自 InputMethod 返回接收其輸入內容的應用程式。可用來讀取遊標周圍的文字、將文字傳送至文字方塊,並將原始金鑰事件傳送至應用程式。應用程式必須擴充這個類別,而不是實作基礎介面 InputConnection
KeyboardView
View 擴充功能,其功能為 會轉譯鍵盤並回應使用者輸入事件。鍵盤配置是由 執行個體 Keyboard, 您可以在 XML 檔案中定義這些元件

設計輸入法使用者介面

輸入法編輯器有兩個主要視覺元素:輸入檢視畫面和 「候選」檢視畫面。您只需導入與 您要設計的輸入方法

輸入檢視畫面

輸入檢視畫面是一種使用者介面,可讓使用者以鍵盤按鍵、手寫或手寫等格式輸入文字 手勢。初次顯示輸入法編輯器時,系統會呼叫 onCreateInputView() 回呼。實作這個方法時,請建立想在輸入法編輯器中顯示的版面配置 然後將版面配置傳回系統。以下程式碼片段為實作範例 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;
}

在這個範例中,MyKeyboardView 是下列項目的自訂實作項目: 算繪 KeyboardKeyboardView

待選項目檢視畫面

待選項目畫面是使用者介面,輸入法編輯器可顯示潛在字詞更正或建議的使用者介面 供使用者選取在輸入法編輯器生命週期中,系統會呼叫 onCreateCandidatesView() 出現時機實作此方法時, 顯示字詞建議的版面配置;如果您不想顯示任何內容,則傳回空值。空值 回應是預設行為,所以如果您沒有提供 或取得寫作建議

使用者介面設計注意事項

本節說明關於輸入法編輯器的使用者介面設計注意事項。

處理多種螢幕大小

輸入法編輯器的使用者介面必須能夠依據不同的螢幕大小縮放,並能處理兩種橫向模式 直向和直向模式在非全螢幕輸入法編輯器模式中,為應用程式保留足夠空間 顯示文字欄位和任何關聯內容,因此佔用的畫面不超過一半 輸入法編輯器全螢幕輸入法編輯器模式並不會造成任何問題。

處理不同的輸入類型

Android 文字欄位可讓您設定特定的輸入類型,例如任意形式文字、數字、網址 電子郵件地址和搜尋字串實作新的輸入法編輯器時,請偵測每個 ] 欄位,並為該欄位提供適當的介面。不過,你不需要設定輸入法編輯器 檢查使用者是否在輸入類型中輸入有效的文字。這是 也就是文字欄位中

以拉丁文輸入法編輯器提供的 Android 平台文字為例 輸入:

顯示拉丁文輸入法編輯器文字輸入內容的圖片
圖 2. 拉丁文輸入法編輯器文字輸入。

以下是拉丁文輸入法編輯器為 Android 平台提供的介面 數字輸入:

顯示拉丁文輸入法編輯器輸入數字的圖片
圖 3. 拉丁文輸入法編輯器的數字。

輸入欄位收到聚焦且輸入法編輯器開始時,系統會呼叫 onStartInputView(), 傳入 EditorInfo 個物件 ,當中包含輸入類型和其他文字欄位其他屬性的詳細資料。在這個物件中 這個 inputType 欄位包含文字欄位的輸入類型。

inputType 欄位是 int,包含多種不同資料的位元模式 輸入類型設定如要測試文字欄位的輸入類型,請使用常數進行遮蓋 TYPE_MASK_CLASS, 輸入:

Kotlin

inputType and InputType.TYPE_MASK_CLASS

Java

inputType & InputType.TYPE_MASK_CLASS

輸入類型位元模式可以是下列任一值,包括:

TYPE_CLASS_NUMBER
輸入數字的文字欄位。如圖 3 所示,拉丁文輸入法編輯器會顯示 。
TYPE_CLASS_DATETIME
輸入日期和時間的文字欄位。
TYPE_CLASS_PHONE
輸入電話號碼的文字欄位。
TYPE_CLASS_TEXT
輸入任何支援字元的文字欄位。

如需這些常數的詳細說明,請參閱 InputType

inputType 欄位可包含其他位元,用於表示文字欄位變化版本 類型,例如:

TYPE_TEXT_VARIATION_PASSWORD
用來輸入密碼的 TYPE_CLASS_TEXT 變化版本。輸入法會隨即顯示 而不是實際文字
TYPE_TEXT_VARIATION_URI
用於輸入網址和其他統一資源的 TYPE_CLASS_TEXT 變化版本 ID (URI)。
TYPE_TEXT_FLAG_AUTO_COMPLETE
TYPE_CLASS_TEXT 的變化版本,用於輸入應用程式的文字 自動完成功能。

測試這些變化版本時,請使用適當的常數遮蓋 inputTypeInputType 的參考說明文件列出了可用的遮罩常數。

傳送簡訊至應用程式

當使用者透過輸入法編輯器輸入文字時,您可以傳送 發生主要事件,或是在應用程式文字欄位中編輯遊標周圍的文字。無論是哪種情況 使用 InputConnection 的執行個體來提供文字。如要取得這個執行個體,請呼叫 InputMethodService.getCurrentInputConnection()

編輯遊標周圍的文字

當您處理現有文字的編輯時, BaseInputConnection 如下:

getTextBeforeCursor()
傳回 CharSequence 包含目前遊標位置之前要求的字元數。
getTextAfterCursor()
傳回 CharSequence,其中包含下列要求的字元數 目前遊標位置。
deleteSurroundingText()
刪除目前遊標位置前後的指定字元數。
commitText()
CharSequence 提交至文字欄位,並設定新的遊標位置。

舉例來說,下列程式碼片段說明如何取代左側四個字元的 將遊標移到「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);

支援在提交前撰寫文字

如果輸入法編輯器預測文字,或需要多個步驟來撰寫字符或字詞,可以顯示 持續更新文字,直到使用者提交該字詞為止,之後您就能使用 合成文字您可以為文字加上 橫跨 setComposingText()

下列程式碼片段示範如何在文字欄位中顯示進度:

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);

攔截硬體金鑰事件

即使輸入法視窗沒有明確的焦點,仍會接收硬體按鍵事件 即可取用或轉送至應用程式舉例來說 請使用方向鍵在 UI 中瀏覽,在組合期間選取候選鍵。 您也可以擷取返回鍵,關閉任何源自輸入法的對話方塊 視窗。

如要攔截硬體按鍵,請覆寫 onKeyDown()onKeyUp()

針對您不想自行處理的金鑰呼叫 super() 方法。

建立輸入法編輯器子類型

子類型可讓輸入法編輯器顯示輸入法編輯器支援的多個輸入模式和語言。子類型可以 代表下列項目:

  • 語言代碼,例如 en_US 或 fr_FR
  • 輸入模式,例如語音、鍵盤或手寫
  • 其他特定於輸入法編輯器的輸入樣式、表單或屬性,例如 10 鍵或 QWERTY 鍵盤配置

模式可以是任何文字,例如「鍵盤」或「語音」子類型也可以公開顯示組合 這類資源

子類型資訊用於通知列提供的輸入法編輯器切換器對話方塊 以及輸入法編輯器設定資訊架構也能顯示特定輸入法編輯器子類型 建構輸入法編輯器時,請使用子類型設施,以便使用者識別和 切換不同的輸入法編輯器語言和模式。

使用 <subtype> 元素。以下程式碼片段定義包含兩種子類型的輸入法編輯器: 美式英文語言代碼的鍵盤子類型,以及法語的另一個鍵盤子類型 法國地區:

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

為確保子類型在 UI 中正確加上了標籤,請使用 `%s` 取得以下子類型標籤: 與子類型的語言代碼標籤相同。接下來的兩個程式碼片段會說明這一點。 第一個程式碼片段會顯示部分輸入法 XML 檔案:

<subtype
    android:label="@string/label_subtype_generic"
    android:imeSubtypeLocale="en_US"
    android:icon="@drawable/icon_en_us"
    android:imeSubtypeMode="keyboard" />

下一段程式碼片段是部分輸入法編輯器的 strings.xml 檔案。字串資源 label_subtype_generic,輸入法使用者介面定義用於設定 子類型標籤的定義如下:

<string name="label_subtype_generic">%s</string>

這項設定會使子類型的顯示名稱與語言代碼設定相符。舉例來說 英文語言代碼時,顯示名稱為「English (US)」。

從通知列中選擇輸入法編輯器子類型

Android 系統可以管理所有輸入法編輯器提供的所有子類型。系統會將輸入法編輯器子類型視為 自己所屬的輸入法編輯器使用者可以從通知列或「設定」應用程式前往 可用的輸入法編輯器子類型的選單,如下圖所示:

顯示語言與輸入系統選單
圖 4. 語言與輸入系統選單。

從「系統設定」中選擇輸入法編輯器子類型

使用者也能在「語言與設定」部分中,控制子類型的使用方式輸入設定面板 變更期間:

顯示「語言選項」選單的圖片
圖 5. 語言系統選單

切換輸入法編輯器子類型

使用者可以提供切換鍵,讓使用者輕鬆切換輸入法編輯器子類型,例如: 鍵盤上的地球形狀語言圖示。這可以改善鍵盤的可用性,也更方便 給使用者如要啟用這項切換功能,請按照下列步驟操作:

  1. 在輸入法的 XML 資源檔案中宣告 supportsSwitchingToNextInputMethod = "true"。您的宣告必須類似下列程式碼片段:
    <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. shouldOfferSwitchingToNextInputMethod() 方法。
  3. 如果這個方法傳回「是」,顯示切換鍵。
  4. 使用者輕觸切換鍵時,請呼叫 switchToNextInputMethod(), 傳遞 false值為「false」能讓系統平等處理所有子類型, 以及他們所屬的 IME。指定「是」時,要求系統循環顯示 。

一般輸入法編輯器注意事項

實作輸入法編輯器時,還需要考量以下幾點:

  • 為使用者提供直接透過輸入法編輯器使用者介面設定選項的方法。
  • 為使用者提供直接透過輸入法使用者介面切換至其他輸入法編輯器的方法。 因為裝置上可能會安裝多個輸入法編輯器。
  • 快速開啟輸入法編輯器的 UI。視需求預先載入或載入任何大型資源,讓使用者 只要輕觸文字欄位,就能立即查看輸入法編輯器。快取資源和檢視畫面供後續使用 輸入方法。
  • 在輸入法視窗隱藏後,立即釋出大型記憶體配置,因此 有足夠的記憶體可以執行使用延遲訊息釋出資源 系統會在幾秒鐘內隱藏輸入法編輯器
  • 請確保使用者能夠針對語言或語言代碼盡可能輸入更多半形字元 與 IME 相關聯的角色使用者可能會在密碼或使用者名稱中使用標點符號,因此您的 IME 必須提供許多不同的字元,讓使用者輸入密碼才能存取 裝置。