標籤:android class code http tar ext
學習目標:
- 實現新的IME
學習目的:
- 掌握AndroidIME架構
學習收穫:
Android 1.5 新特色之一就是IME架構(Input Method Framework,IMF),正是它的出現,才為誕生不帶實體鍵盤的裝置提供了可能。IMF設計用來支援不同的IME,包括了soft keyboard,hand-writing recognizes和hard keyboard translators。這裡,我們把焦點鎖定在soft keyboard上。
新特色對普通應用開發人員而言,應該確保讓應用能夠和IMF很好的配合,提供優秀的使用者體驗。應用要做的最重要事情,就是對每個EditText使用 新的屬性android:inputType,這個屬性實際代替了很多已經存在的屬性,包括android:password, android:singleLine, android:numeric, android:phoneNumber, android:capitalize, android:autoText, android:editable。如果你兩個都聲明了,Cupcake裝置就會使用新的android:inputType屬性,而忽視其他的。
主要的API就是android.view.inputmethod.InputMethodManager,你可以通過Context.getSystemService方法來擷取。它允許你和全域IME狀態進行互動,例如顯式隱藏或者顯示IME的IME地區。
新特色對於系統開發人員而言,其提供了開發各種各樣語言IME的實現入口,有了它,其他語言IME才能進駐Android。以下內容即關注如何?一個IME。
要建立一個IME,需要繼承android.inputmethodservice.InputMethodService。這個類提供了IME的 基本實現,包括狀態管理、控制IME可見,還有和當前activity通訊。Android提供了兩個IME和一個樣本,這兩個IME分別是 PinyinIME和LatinIMEIME,你可以在源碼packages/inputmethods下找到,樣本即SoftKeyboard,可以在 SDK 1.5下的platforms/android-1.5/samples下找到。這三個IME提供了目前實現Android平台IME實現的最佳參考。
IME的打包方式和其他應用是相同的,在AndroidManifest.xml中,要把IME聲明為service,並附帶上合適的intent filter和相關的meta data。如下所示:
<service android:name=".DemoIme"
android:label="@string/ime_name"
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允許使用者調整設定,那麼你還應該提供一個setting activity。這個時候不要忘記在input-method的XML檔案中,加入相關的屬性,如以下所示(這個檔案就是剛才meta-data中的@xml/method):
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.demo.SettingsActivity"
android:isDefault="@bool/im_is_default" />
IME在UI展現上,有兩個主要的可見元素,input view和candiate view。但這不是必需的,可以根據實際需要選擇你需要的元素。Input View,是使用者從鍵盤、手寫或者其他方式輸入文本的地方。當IME第一次展現的時 候,InputMethodService.onCreateInputView()就會被調用。Candidates View,是候選詞彙集合出現的地方。其可有可無,可以在調用InputMethodService.onCreateCandidatesView時返 回null,–這是它的預設行為。
應用的文本區可以有不同的輸入類型,包括文本、數值、URL、郵箱地址和搜尋,因此在你實現新的IME時,需要當心不同的輸入類型。IME並不會自 動切換不同的輸入類型,所以你要在IME中支援所有的類型。不過可以輕鬆一點的是, IME並不負責輸入內容的校正,—因為這是應用的職責。網頁模板
InputMethodService.onStartInputView()被調用時,會傳入一個EditorInfo對象,這個對象包含了關於 輸入類型和text field的其他屬性的細節。EditorInfo.inputType和EditorInfo.TYPE_CLASS_MASK可以是很多值,包括 TYPE_CLASS_NUMBER,TYPE_CLASS_DATETIME,TYPE_CLASS_PHONE,TYPE_CLASS_TEXT。可 以通過android.text.InputType瞭解更多資訊。
要把文本發送給應用有兩種方式,你可以發送單一的按鍵事件,也可以在應用的文字框內編輯游標附近的文本。發送按鍵事件,可以簡單構造 KeyEvent對象,並且調用InputConnection.sendKeyEvent(),或者更加方便一點,使用 InputMethodService.sendDownUpKeyEvents(keyEventCode)。http://www.huiyi8.com/moban/在編輯文字框 時,android.view.inputmethod.InputConnection有一些很有用的方法,例如 getTextBeforeCursor()等等。