輸入法編輯器(IME)是一個便于用戶輸入文本的控件。Android提供了一個可擴展的輸入法框架,允許應(yīng)用程序提供可替代的輸入法,比如屏幕上的鍵盤或者語音輸入。在安裝 輸入法后,用戶可以通過系統(tǒng)選項選擇想要使用的輸入法。
想要添加一個輸入法,你需要創(chuàng)建一個Android應(yīng)用并包含一個繼承自InputMethodService的類。此外,同城創(chuàng)建一個設(shè)置頁面來承載輸入發(fā)的各個選項。你可以自行定義一個設(shè)置的UI。
下面講述以下幾個內(nèi)容: · 輸入法的生命周期 · 在應(yīng)用的清單文件中定義輸入法組件 · 輸入法相關(guān)接口 · 設(shè)計一個款輸入法的UI · 發(fā)送文本到應(yīng)用 · 輸入法子類型的使用
一、輸入法的生命周期
輸入法的生命周期如下圖所示:
下面的部分講述如何根據(jù)輸入法的生命周期實現(xiàn)UI和輸入法功能。
二、在清單文件中定義輸入法組件 在Android系統(tǒng)中,IME是一個包含特殊IME服務(wù)的應(yīng)用程序。應(yīng)用的清單文件必須聲明輸入法服務(wù),請求必須的權(quán)限,提供一個intent filter來匹配 action.view.InputMethod,并提供定義了IME特征的元數(shù)據(jù)(metadata)。此外,可以定義一個設(shè)置頁面來提供用戶修改IME配置的接口,它可以被系統(tǒng)設(shè)置所啟動。 下面的代碼片段聲明了一個IME服務(wù)。請求了 BIND_INPUT_METHOD 權(quán)限來允許服務(wù)連接到系統(tǒng)的IME,建立intent filter和metadata:
<!-- 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>下面的代碼片段聲明了IME的設(shè)置頁面,它擁有 ACTION_MAIN 的intent filter來表示它是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>也可以從IME的UI提供直接進入設(shè)置的入口。
三、輸入法API 與IME相關(guān)的類在 android.inputmethodservice 和 android.view.inputmethod 包中。KeyEvent 類對于處理鍵盤特征至關(guān)重要。 IME的核心部分是一個服務(wù)組件,即一個繼承自InputMethodService的類。此外為了實現(xiàn)一般服務(wù)的生命周期,這個類提供了IME的UI,處理用戶輸入和傳輸文本到指定區(qū)域以及當(dāng)前焦點的回調(diào)。InputMethodService類提供了絕大多數(shù)管理IME狀態(tài)和與當(dāng)前輸入?yún)^(qū)域交互的實現(xiàn)。
下面幾個類也很重要。 BaseInputConnection 定義了輸入法和應(yīng)用之間接收輸入的交互通道。使用它來讀取光標(biāo)周圍的文本,提交文本到輸入框以及發(fā)送鍵盤事件給應(yīng)用。應(yīng)用應(yīng)該集成此類。
KeyboardView 一個View的擴展,描繪了一個鍵盤和用戶輸入事件的響應(yīng)。鍵盤的布局是被Keyboard的實例指定,可以定義一個XML文件。
四、設(shè)計輸入法UI IME有兩個主要的視覺元素:即輸入視圖和備選視圖。你只需要實現(xiàn)和你設(shè)計的輸入法有關(guān)的元素。
1.輸入視圖 輸入視圖是用戶使用按鍵,手寫或者手勢在表單中輸入文本的UI。 當(dāng)IME第一次顯示,系統(tǒng)會調(diào)用 onCreateInputView() 回調(diào)。在你實現(xiàn)的這個方法中,你創(chuàng)建你想要的IME窗口的布局并返回給系統(tǒng)。下面片段是一個例子:
@Override public View onCreateInputView() { MyKeyboardView inputView = (MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null); inputView.setOnKeyboardActionListener(this);inputView.setKeyboard(mLatinKeyboard); return mInputView; }這里的MyKeyboardView是一個自定義的實現(xiàn)了 KeyboardView 的實例,如果你構(gòu)建的是一個傳統(tǒng)的QWERTY鍵盤,請查看 KeyboardView 類。
2.候選視圖 候選視圖是供用戶選擇可選詞和推薦詞的視圖。在IME的生命周期中,系統(tǒng)在準(zhǔn)備好顯示備選視圖的時候會調(diào)用onCreateCandidatesView()。在你實現(xiàn)的這個方法中,返回顯示詞匯建議的布局,當(dāng)什么都不顯示時,返回null。 若要查看實現(xiàn)用戶建議詞匯的例子,請查看SoftKeyboard示例應(yīng)用。
3.UI設(shè)計依據(jù) 此部分介紹了一些IME的UI設(shè)計思想。
· 應(yīng)對多元化的屏幕尺寸 你的IME的UI必須可以適配不同屏幕的尺寸,且必須處理豎屏和橫屏兩種方向。在非全屏模式下,為應(yīng)用程序留出足夠的空間以顯示文本字段和任何相關(guān)聯(lián)的上下文,使得IME不會占用屏幕一半以上的空間。在全屏模式下沒有這個問題。
· 處理不同的輸入類型 Android的輸入框允許你選擇一個特殊的輸入類型,比如自由文本,數(shù)字,網(wǎng)址,郵箱地址,收索內(nèi)容等。當(dāng)你實現(xiàn)一個新的IME,您需要檢測每個字段的輸入類型,并為其提供適當(dāng)?shù)慕涌凇5牵悴槐卦O(shè)置IME以檢查用戶輸入的文本對輸入類型有效; 這是擁有文本字段的應(yīng)用程序的責(zé)任。
當(dāng)輸入字段接收焦點并且您的IME啟動時,系統(tǒng)調(diào)用 onStartInputView(),傳遞一個 EditorInfo 對象,該對象包含有關(guān)文本字段的輸入類型和其他屬性的詳細信息。 在此對象中,inputType 字段包含文本字段的輸入類型。 輸入類型字段是一個包含用于各種輸入類型設(shè)置的位模式的int參數(shù)。 要測試它的文本字段的輸入類型,用常量TYPE_MASK_CLASS屏蔽它,像這樣: inputType & InputType.TYPE_MASK_CLASS 輸入類型位模式可以具有幾個值中的一個,包括: TYPE_CLASS_NUMBER 用于輸入數(shù)字的文本字段。 TYPE_CLASS_DATETIME 用于輸入日期和時間的文本字段。 TYPE_CLASS_PHONE 用于輸入電話號碼的文本字段。 TYPE_CLASS_TEXT 用于輸入所有支持的字符的文本字段。
這些常量在 InputType 的參考文檔中有更詳細的描述。 inputType字段可以包含指示文本字段類型的其他位,例如: TYPE_TEXT_VARIATION_PASSWord 用于輸入密碼的TYPE_CLASS_TEXT 的變體。 輸入法將顯示標(biāo)記,而不是實際文本。 TYPE_TEXT_VARIATION_URI 用于輸入網(wǎng)址和其他統(tǒng)一資源標(biāo)識符(URI)的TYPE_CLASS_TEXT 的變體。 TYPE_TEXT_FLAG_AUTO_COMPLETE TYPE_CLASS_TEXT 的變體,用于輸入應(yīng)用程序從字典,搜索或其他工具中“自動完成”的文本。 記住在測試這些變量時,用適當(dāng)?shù)某?shù)掩蔽輸入類型。 可用的掩碼常數(shù)在輸入類型的參考文檔中列出。
注意:在您自己的IME中,確保在將其發(fā)送到密碼字段時正確處理文本。 在輸入視圖和候選視圖中的用戶界面中隱藏密碼。 還要記住,您不應(yīng)該在設(shè)備上存儲密碼。 要了解更多信息,請參閱“為安全性設(shè)計”指南。
五、向應(yīng)用程序發(fā)送文本 當(dāng)用戶使用IME輸入文本時,您可以通過發(fā)送單個鍵事件或在應(yīng)用程序的文本字段中編輯光標(biāo)周圍的文本來向應(yīng)用程序發(fā)送文本。 在任一情況下,您都使用 InputConnection 的實例來傳遞文本。 要獲取此實例,請調(diào)用 InputMethodService.getCurrentInputConnection() 。
1.編輯光標(biāo)周圍的文本 當(dāng)處理文本字段中現(xiàn)有文本的編輯時,BaseInputConnection 中一些更有用的方法是: getTextBeforeCursor() 返回包含當(dāng)前光標(biāo)位置之前的請求字符數(shù)的 CharSequence 。 getTextAfterCursor() 返回包含當(dāng)前光標(biāo)位置后的請求字符數(shù)的 CharSequence 。 deleteSurroundingText() 刪除當(dāng)前光標(biāo)位置前后的指定數(shù)量的字符。 commitText() 向文本字段提交 CharSequence 并設(shè)置新的光標(biāo)位置。
例如,以下代碼段顯示如何使用文本“Hello!”替換光標(biāo)左側(cè)的四個字符:
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);2.在提交之前撰寫文本 如果您的IME執(zhí)行文本預(yù)測或需要多個步驟來組成字形或單詞,則可以在文本字段中顯示進度,直到用戶提交單詞,然后您可以用完成的文本替換部分組合。 當(dāng)你傳遞給 setComposingText()時,你可以通過添加一個“span”來對文本進行特殊處理。 以下代碼段顯示了如何在文本字段中顯示進度:
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1);... ic.setComposingText("Composin", 1);... ic.commitText("Composing ", 1);以下屏幕截圖顯示了用戶看到的頁面:
3.攔截硬件按鍵事件 即使輸入法窗口沒有明確的焦點,它首先接收硬件鍵事件,并且可以選擇使用它們或?qū)⑺鼈冝D(zhuǎn)發(fā)到應(yīng)用程序。 例如,您可能想要使用方向鍵在UI中導(dǎo)航以在組合期間選擇候選項。 您可能還想捕獲返回鍵以關(guān)閉源自輸入法窗口的任何彈出窗口。 要攔截硬件鍵,重寫onKeyDown()和 onKeyUp()。 請參閱 SoftKeyboard 示例應(yīng)用程序的示例。 記住要為你不想處理的鍵調(diào)用super()方法。
六、創(chuàng)建IME子類型 子類型允許IME公開IME支持的多種輸入模式和語言。 子類型可以表示: · 區(qū)域設(shè)置,如en_US或fr_FR · 輸入模式,如語音,鍵盤或手寫 · IME特有的其他輸入樣式,表單或?qū)傩裕?0鍵或qwerty鍵盤布局。
基本上,模式可以是諸如“鍵盤”,“語音”等的任何文本。 子類型還可以暴露這些的組合。 子類型信息用于IME切換器對話框,該對話框可從通知欄和IME設(shè)置中使用。 該信息還允許框架直接引出IME的特定子類型。 當(dāng)構(gòu)建IME時,使用子類型工具,因為它有助于用戶識別和在不同的IME語言和模式之間切換。
您可以使用元素在輸入法的XML資源文件之一中定義子類型。 以下代碼段定義了一個具有兩個子類型的IME:美國英語語言環(huán)境的鍵盤子類型,法國的法語語言環(huán)境的另一個鍵盤子類型
<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:imeSubtypeLanguage="en_US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="some1.從通知欄中選擇TIME子類型 Android系統(tǒng)管理所有IME公開的所有子類型。 IME子類型被視為它們所屬的IME的模式。 在通知欄中,用戶可以為當(dāng)前設(shè)置的IME選擇可用的子類型,如以下屏幕截圖所示:2.從系統(tǒng)設(shè)置選擇IME子類型 用戶可以在“系統(tǒng)設(shè)置”區(qū)域的“語言和輸入”設(shè)置面板中控制子類型的使用方式。 在 SoftKeyboard 示例應(yīng)用程序中,文件InputMethodSettingsFragment.java包含一個在IME設(shè)置中實現(xiàn)子類型啟用程序的實現(xiàn)。 有關(guān)如何在IME中支持輸入法子類型的更多信息,請參閱Android SDK中的 SoftKeyboard 示例應(yīng)用程序。
3.在IME子類型之間切換 您可以允許用戶通過提供切換鍵(如球形語言圖標(biāo))作為鍵盤的一部分,在多個IME子類型之間輕松切換。 這樣做大大提高了鍵盤的可用性,并可以幫助避免用戶的失望。 要啟用此類切換,請執(zhí)行以下步驟: (1). 在輸入法的XML資源文件中聲明 supportsSwitchingToNextInputMethod = “true” 。 您的聲明應(yīng)類似于以下代碼段:
<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). 調(diào)用 shouldOfferSwitchingToNextInputMethod() 方法。 (3). 如果方法返回true,則顯示切換鍵。 (4). 當(dāng)用戶點擊切換鍵時,調(diào)用 switchToNextInputMethod(),將false傳遞給第二個參數(shù)。 值false表示系統(tǒng)平等對待所有子類型,而不管它們屬于什么IME。 指定true要求系統(tǒng)在當(dāng)前IME中循環(huán)遍歷子類型。
注意:在Android 5.0(API級別21)之前,switchToNextInputMethod()不知道 supportsSwitchingToNextInputMethod 屬性。 如果用戶切換到IME而沒有切換鍵,他可能會卡在該IME中,無法輕松地切換出來。
七、一般IME注意事項 以下是您實現(xiàn)IME時需要考慮的其他事項: · 為用戶提供一種直接從IME的UI設(shè)置選項的方法。 · 因為設(shè)備上可以安裝多個IME,所以提供了用于用戶從輸入法UI直接切換到不同的IME的方式。 · 快速啟動IME的UI。根據(jù)需要預(yù)加載或加載任何大型資源,以便用戶在點擊文本字段時看到IME。緩存資源和視圖,用于后續(xù)調(diào)用輸入法。 · 相反,您應(yīng)該在隱藏輸入法窗口后立即釋放大量內(nèi)存分配,以便應(yīng)用程序可以有足夠的內(nèi)存來運行。如果IME處于隱藏狀態(tài)幾秒鐘,請考慮使用延遲消息來釋放資源。 · 請確保用戶可以為與IME關(guān)聯(lián)的語言或區(qū)域設(shè)置輸入盡可能多的字符。請記住,用戶可以在密碼或用戶名中使用標(biāo)點符號,因此您的IME必須提供許多不同的字符,以允許用戶輸入密碼并訪問設(shè)備。
新聞熱點
疑難解答
圖片精選