AndroidIME與軟鍵盤簡單分析
原文地址:http://www.longene.org/forum/viewtopic.php?f=5&t=3935
以原始碼中/android_src/packages/inputmethod/LatinIME/為例。
我們已經知道了軟鍵盤是由IME調出的,並且彈出軟鍵盤的語句為:
-
代碼: 全選
-
InputMethodManager imm = null;
imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(vv, InputMethodManager.SHOW_FORCED);
android.view.inputmethod.InputMethodManager,你可以通過Context.getSystemService方法來擷取。它允許你和全域IME狀態進行互動,例如顯式隱藏或者顯示IME的IME地區。
在IME中,有兩種可視元素,軟鍵盤和候選字地區,即keyboard view和candiate view。
這裡著重討論的是軟鍵盤,其實後選字地區與軟鍵盤也大同小異。
當IME第一次展現的時 候,InputMethodService.onCreateInputView()就會被調用。Candidates View,是候選詞彙集合出現的地方。其可有可無,可以在調用InputMethodService.onCreateCandidatesView時返 回null,–這是它的預設行為。
InputMethodService.java在/android_src/frameworks/base/core/java/android/inputmethodservice/下:
閱讀其中的 onCreateInputView(),結果發現該函數不執行任何代碼,只返回一個null。
原來不同的IME會重寫該方法。
在latinIME中的LatinIME.java中的onCreateInputView():
-
代碼: 全選
-
195 @Override
196 public View onCreateInputView() {
197 mInputView = (LatinKeyboardView) getLayoutInflater().inflate(
198 R.layout.input, null);
199 mKeyboardSwitcher.setInputView(mInputView);
200 mKeyboardSwitcher.makeKeyboards();
201 mInputView.setOnKeyboardActionListener(this);
202 mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, 0);
203 return mInputView;
204 }
由以上代碼可以知道在IMEservice中對軟鍵盤進行了初始化。
在onStartInputView()函數中,傳入一個EditorInfo對象來判斷輸入的類型,並由此彈出不同類型的軟鍵盤,比如數字鍵台,全尺寸鍵盤等等。
四種不同的類型為:
-
代碼: 全選
-
TYPE_CLASS_NUMBER
TYPE_CLASS_DATETIME
TYPE_CLASS_PHONE
TYPE_CLASS_TEXT
大家有什麼見解可以一起討論討論~頁首
Re: AndroidIME與軟鍵盤簡單分析
由 timeboy 於 2009-10-27 14:38
mKeyboardSwitcher變數是哪裡定義的
-
timeboy
-
-
文章: 423
-
註冊: 2008-12-10 12:28
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 zxbeef 於 2009-10-28 8:26
timeboy 寫道:mKeyboardSwitcher變數是哪裡定義的
mKeyboardSwitcher是該IME自己寫的類,控制輸入的模式。
-
zxbeef
-
-
文章: 577
-
註冊: 2009-03-04 14:33
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 timeboy 於 2009-10-28 9:22
執行完onCreateInputView裡的程式,軟鍵盤就可以彈出來了?
-
timeboy
-
-
文章: 423
-
註冊: 2008-12-10 12:28
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 zxbeef 於 2009-10-28 15:54
timeboy 寫道:執行完onCreateInputView裡的程式,軟鍵盤就可以彈出來了?
onCreateInputView()函數中:
-
代碼: 全選
-
mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, 0);
而在KeyboardSwitcher的setKeyboardMode()函數中:
-
代碼: 全選
-
mInputView.setKeyboard(keyboard);
這樣就能顯示鍵盤了。
-
zxbeef
-
-
文章: 577
-
註冊: 2009-03-04 14:33
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 timeboy 於 2009-10-29 9:53
zxbeef 寫道:
timeboy 寫道:執行完onCreateInputView裡的程式,軟鍵盤就可以彈出來了?
onCreateInputView()函數中:
-
代碼: 全選
-
mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, 0);
而在KeyboardSwitcher的setKeyboardMode()函數中:
-
代碼: 全選
-
mInputView.setKeyboard(keyboard);
這樣就能顯示鍵盤了。
好的,還應該把android裡整體IME結構分析一下,不如,IME管理模組(不知道這個是不是一個進程),程式與管理模組和IME模組的關係
-
timeboy
-
-
文章: 423
-
註冊: 2008-12-10 12:28
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 zxbeef 於 2009-10-29 10:01
timeboy 寫道:好的,還應該把android裡整體IME結構分析一下,不如,IME管理模組(不知道這個是不是一個進程),程式與管理模組和IME模組的關係
對的,不過這需要時間完整詳細的整理代碼。。。
-
zxbeef
-
-
文章: 577
-
註冊: 2009-03-04 14:33
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 timeboy 於 2009-10-29 10:11
zxbeef 寫道:
timeboy 寫道:好的,還應該把android裡整體IME結構分析一下,不如,IME管理模組(不知道這個是不是一個進程),程式與管理模組和IME模組的關係
對的,不過這需要時間完整詳細的整理代碼。。。
這個是個大工程啊,要完整分析不太容易
-
timeboy
-
-
文章: 423
-
註冊: 2008-12-10 12:28
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 zxbeef 於 2009-10-29 10:13
timeboy 寫道:這個是個大工程啊,要完整分析不太容易
是的,一點點分部分慢慢來。。。
-
zxbeef
-
-
文章: 577
-
註冊: 2009-03-04 14:33
頁首
Re: AndroidIME與軟鍵盤簡單分析
由 alexguitar 於 2010-04-20 20:37
請問一下有人知道如何讓預設的soft keyboard layout 縮小嗎?我在LatinIME/res/layout/input.xml修改
android:layout_width="fill_parent"
android:layout_height="wrap_content"
為
android:layout_width="50px"
android:layout_height="20px"
都沒反應
麻煩版上的大大幫我一下
謝謝