為輸入文字框或其他視圖建立一個IME,需要繼承InputMethodService類。InputMethodService提供了很多的IME的基礎實現,管理狀態的條款、IME的可見度、與當前可見的Activity溝通.
一個好的出發點是SDK裡提供的SoftKeyboard範例,也可以修改範例代碼去建立你自己的IME。
IME像應用和服務一樣被打包。在AndroidManifest.xml檔案中,把IME作為一個服務(Service)來聲明,附帶一些適當的intent過濾器和一些相關的中繼資料: -----------------------------------------------------------------------------------------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.fastinput">
<application android:label="@string/app_label">
<!-- 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>
<!-- Optional activities. A good idea to have some user settings. -->
<activity android:name="FastInputIMESettings" android:label="@string/fast_input_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
</application>
</manifest>
-----------------------------------------------------------------------------------------------------
假如你的輸入發允許使用者去調整一些設定,你應該提供一個可以運行在設定應用上的設定頁面。這是可選的,你也可以選擇在IME的UI上直接提供所有的使用者佈建.
為一個IME的生命週期:
視覺元素:
IME有兩個主要的視覺元素:輸入視圖和候選視圖。假如其中有一個是不相關的你的IME的經驗,你不必遵循這種風格, 輸入視圖: 就是使用者可以按鍵、手寫或其他手勢視圖。InputMethodService.onCreateInputView()被調用時,IME第一時間被顯示。建立並返回你想要顯示的IME視窗視圖等級。
候選視圖: 潛在的、提交使用者選擇的,可以關聯,也可以不關聯到你的IME,預設的行為是,當調用InputMethodService.onCreateCandidatesView()時,你可以返回null。
設計不同的輸入類型: 一個應該的文本域可以有不同的輸入類型指定在它們上,例如,自由形式的IME,數字,URL,E-mail地址和搜尋。當你實現一個IME的時候,你需要注意到不同的輸入類型。IME不能自動的替換輸入類型,所以你需要在你的IME上支援所有的類型。然而,IME是不負責驗證輸入發送到應用程式,這就是應用程式的責任。例如,LatinIME提供了android平台文本和電話號輸入的不同布局:
InputMethodService.onStartInputView(),攜帶一個包含關於輸入類型和應用程式的文字欄位的其他屬性的細節的EditorInfo被調用。
(EditorInfo.inputType & EditorInfo.TYPE_CLASS_MASK)可以是許多不同的值,包括:
TYPE_CLASS_NUMBER
TYPE_CLASS_DATETIME
TYPE_CLASS_PHONE
TYPE_CLASS_TEXT
EditorInfo.inputType可以包含其他掩蓋位,表明了類變化和其他標誌。例如,TYPE_TEXT_VARIATION_PASSWORD或TYPE_TEXT_VARIATION_URI或TYPE_TEXT_FLAG_AUTO_COMPLETE。
密碼域
注意不要在你的介面中顯示密碼,除了提醒使用者外也不要把密碼儲存起來。把輸入文本傳給應用
有兩種方法可以發送文本到應用。您可以發送單獨的按鍵事件,也可以編輯周圍應用程式的文字欄位游標文本。
要發送一個按鍵事件,您可以簡單地構造KeyEvent對象,並調用InputConnection.sendKeyEvent()。下面是一些例子:
--------------------------------------------------------------------------------------------------
InputConnection ic = getCurrentInputConnection();
long eventTime = SystemClock.uptimeMillis();
ic.sendKeyEvent(new KeyEvent(eventTime, eventTime,
KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,
KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
ic.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
KeyEvent.ACTION_UP, keyEventCode, 0, 0, 0, 0,
KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
-----------------------------------------------------------------------------------------------
或者,利用方便的方法:
-----------------------------------------------------------------------------------------------
InputMethodService.sendDownUpKeyEvents(keyEventCode);
-----------------------------------------------------------------------------------------------
註:建議使用諸如因為可能適用每按一個鍵後的文本過濾器的電話號碼領域的某些領域上面的方法。返回鍵和刪除鍵也應被作為某些輸入類型的原料主要活動,如應用程式可能為特定關鍵事件看,以執行一個動作。
當編輯文字欄位的文本時,android.view.inputmethod.InputConnection一些更有用的方法有:
-----------------------------------------------------------------------------------------------
getTextBeforeCursor()
getTextAfterCursor()
deleteSurroundingText()
commitText()
例如,假設文本“Fell”是左邊的游標和你想代之以“Hello!”:
-----------------------------------------------------------------
1.InputConnection ic = getCurrentInputConnection();
2.ic.deleteSurroundingText(4, 0);
3.ic.commitText("Hello", 1);
4.ic.commitText("!", 1);
沒有提交前的編寫
如果您的IME做一些預測的文本實物或需要多個步驟,組成一個字或字形,您可以顯示,直到使用者在文本領域的進展犯了字,然後您可以替換完成的文字部分組成。這次所組成的文本將被反白的文字欄位中以某種方式,如底線。
------------------------------------------------------
InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
....
ic.setComposingText("Composin", 1);
....
ic.commitText("Composing ", 1);
六.攔截硬體按鍵訊息
儘管IME視窗沒有foucs,但是它最先收到硬體的按鍵訊息,如果需要處理這些硬體按鍵訊息,你只需要
重寫InputMethodService.onKeyDown() 與InputMethodService.onKeyUp(),如果你不想處理某個按鍵,記得調
用super.onKey* 。
七.其他注意點
1.提供一個使用者可以直接從當前IME進行相關IME設定的方式。
2.提供一個使用者可以切換不同IME的方式。
3.讓IME介面儘快的彈出,資源或者耗時間長度的操作可以稍後載入。
4.當IME視窗被隱藏的時候,大塊的記憶體配置最好儘快釋放
5.確保IME能包含最常用的字元。
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------