android 軟鍵盤完全解析 InputMethodManager

官方文檔:Central system API to the overall input method framework (IMF) architecture, which arbitrates interaction between applications and the current input method. You can retrieve an instance of this interface with Context.getSystemService()

翻譯:輸入方法框架(IMF)的系統中心API,決定應用程序和當前輸入方法的相互影響關係。 通過Context.getSystemService() 來獲取它的一個實例。


結構概要:

在IMF框架中,主要涉及到一下3個部分。

1、input method manager 被描述爲一個管理其他部分相互作用的系統中心類。他被描述爲一個客戶端的API,即存在於每個應用的上下文中,並且可以與全局系統服務交互,用來管理進程之間的相互作用的。

2、input method(IME)實現了一個允許用戶生成文本的特殊的交互模型。系統綁定當前正在使用的輸入法,引起他被創建並運行,並通知何時隱藏和顯示UI。注意:同時只有一個輸入法在運行。

3、許多的客戶端應用程序都可以通過 input method manager來管理輸入的焦點和控制IME 的狀態。但每次只允許一個這樣的客戶端是active 的。


使用的注意點:

1、使用對象通常是TextView 或者他的子類

2、通過設置Activity 的windowSoftInputMode 屬性來處理當鍵盤顯示的時候被隱藏的空間的處理方式以及軟鍵盤是否默認顯示。

它的值必須下列列表的中的值,一般是一個 "state.." 值加一個"adjust.." 值。比如 

android:windowSoftInputMode="stateAlwaysVisible|adjustPan"

  • stateUnspecified:軟鍵盤狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置
  • stateUnchanged:當這個Activity 出現時,軟鍵盤將一直保持在上一個Activity 裏的狀態
  • stateHidden:用戶選擇Activity 時,軟鍵盤總是被隱藏
  • stateAlwaysHidden:當該Activity 主窗口獲取焦點時,軟鍵盤也總是被隱藏
  • stateVisible:軟鍵盤通常是可見的
  • stateAlwaysVisible:用戶選擇了該Activity 後軟鍵盤總是顯示的狀態
  • adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
  • adjustResize:該Activity 總是調整屏幕的大小以便留出軟鍵盤的空間
  • adjustPan:當前窗口自動移動,以便當前焦點不被鍵盤覆蓋,用戶總能看見輸入內容的部分

安全性:

因爲他本質上完全驅動了UI,並且能夠監聽用戶的任何輸入。而且Android 允許第三方的(自定義)的IME,所以要非常慎重的考慮他的安全性

1、僅僅系統纔可以直接訪問InputMethod 接口,通過BIND_INPUT_METHOD permission。他保證了不會被其他不被信任的客戶端訪問。

2、可能有許多的客戶端進程在訪問IMF,但只有一個是活動的。其他非活動的是不可以與IMF 交互的

3、客戶端是通過InputMethodSession 接口與IME來交互的。它會爲每一個客戶端創建一個實例,僅僅正在被執行的客戶端的InputMethodSession纔會與當前的IME交互。

4、僅僅活動的客戶端的InputConnection 纔會接受操作。IMF會告訴每一個進程是否它是活動的。並且不活動的進程調用當前的InputConnection 將會被忽略。這保證了IME只能傳遞事件和text給當前用戶可見的UI

5、IME不會與InputConnection 交互當屏幕關閉的時候。

6、客戶端應用程序可以訪問系統讓用戶來選擇一個新的IME,但是不能以編程(動態代碼)的方式來切換到它自己。另一方面,一個IME,如果它有了用戶輸入的完整控制權,那麼他是允許以編程的方式來切換到另一個輸入法的

7、用戶必須明確的設置開啓一個新的IME,在切換使用它之前。以便來告訴系統用戶是瞭解此輸入法的並且想使用它


下面說一下軟鍵盤的最基本使用方法:

mEditTextPassword.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                //獲取系統 IMM
                InputMethodManager imm = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);
                if (!hasFocus) {
                    //隱藏 軟鍵盤
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                } else {
                    //顯示 軟鍵盤
                    imm.showSoftInput(v, 0);
                }
            }
        });

下一篇將講軟鍵盤在實際項目中使用時對其的操作,以及對出現的問題的解決方案



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章