Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android IMF輸入法總結

Android IMF輸入法總結

編輯: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 , 轉載請保留.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved