編輯:Android開發實例
IMF是input method framework的簡稱, 它是Android 1.5新添加進去的一個重要功能,用來支持軟鍵盤、各種的輸入法。
到目前位置(2009-04-03),Android 1.5還沒有正式發布,但IMF的功能已經很穩定,其上已經存在有3種輸入法。分別是
LatinIME(軟鍵盤)、 OpenWnn(CJK輸入法)、PinyinIME(GOOGLE 拼音),還缺少中文的手寫、五筆。
雖說按照已有的輸入法模塊, 也能寫出自己想要的輸入法。但是弄懂底層一些的東西,對於寫新的輸入法還是有幫助的。
相關代碼的位置:
frameworks/base/core/java/com/android/internal/view/
IMF接口定義
frameworks/base/core/java/android/view/inputmothod/
IMF客戶端
frameworks/base/core/java/android/inputmethodservice/
IMF服務端
frameworks/base/services/java/com/android/server/InputMethodManagerService.java
輸入法管理服務
packages/inputmethods/
現有的輸入法
development/samples/SoftKeyboard/
軟鍵盤示例
frameworks/base/core/java/android/view/View.java
frameworks/base/core/java/android/widget/TextView.java
控件和輸入法的交互
按照SDK文檔的敘述,IMF包含3個主要部分:
1、input method manager (IMM)
相當於客戶端的API,協調其它部分的互動,負責跟系統服務(IMMS) 通訊。
2、input method (IME)
界面和輸入法引擎, 處理用戶的輸入。
3、client applications
傳遞一些信息, IMM用來決定焦點和IME狀態, IME一次只能有一個Client連接。
InputMethodManager
實例化的時候, 會連接到IMMS服務,然後一些調用裡會請求IMMS的服務。
InputMethodManagerService
處理來自InputMethodManager的請求,管理輸入法服務。
初始化的時候,會做如下一些事情:
1、注冊一些系統事件,處理事件(開關屏、關閉系統對話框、包改變)跟輸入法的交互, 例如: 關屏時會把輸入法菜單關閉;
輸入法包被刪除時,將輸入法從可用列表移除等。
2、加載輸入法列表(buildInputMethodListLocked),讀取啟用的輸入法,如果設置為空,加載全部輸入法,並選擇一個默認輸入法。
3、加載狀態欄圖標、加載DB服務端。
View和輸入法的交互
onFocusChanged()
失去焦點調用用imm.focusOut(), 得到焦點調用imm.focusIn()
onWindowFocusChanged
失去焦點調用用imm.focusOut(), 得到焦點調用imm.focusIn()
TextView和輸入法的交互
setInputType()
改變輸入法類型後, 會重啟輸入法imm.restartInput()
onEditorAction()
收到輸入完成事件,隱藏輸入法界面imm.hideSoftInputFromWindow()
onDraw()
輸入框內容改變,更新輸入法的內容imm.updateExtractedText
輸入框文本被選擇, 更新輸入法的選擇信息imm.updateSelection
輸入框的光標位置改變, 更新輸入法的光標位置imm.updateCursor
ps. imm.isWatchingCursor
onKeyUp()
收到KEYCODE_DPAD_CENTER按鍵事件, 顯示輸入法界面imm.showSoftInput,這個事件鼠標左鍵點擊,都是輸入框獲取焦點。
收到KeyEvent.KEYCODE_ENTER按鍵事件,狀態是輸入完成,關閉輸入法界面imm.hideSoftInputFromWindow()
onTouchEvent()
觸屏事件, 輸入框獲取焦點, 顯示輸入法界面imm.showSoftInput
isInputMethodTarget()
調用imm.isActive(), 用來判斷此控件是否啟用輸入法
onTextContextMenuItem()
如果用戶選擇了“切換輸入法”(ID_SWITCH_INPUT_METHOD),顯示輸入法菜單imm.showInputMethodPicker
setKeyListener()
每次調用都重啟輸入法imm.restartInput()
setText()
輸入框內容改變, 重啟輸入法imm.restartInput()
轉自:http://www.getideas.cn/?p=231 , 轉載請保留.
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
由上篇Android Permission權限機制引子,我們知道Android 通過在每台設備上實施了基於權限的安全策略來處理安全問題,采用權限來限制安裝應用程序
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩