Android軟鍵盤相關 1 Android顯示和隱藏軟鍵盤方法 2 顯示軟鍵盤 3 隱藏軟鍵盤 切換軟鍵盤狀態 參考

1 Android顯示和隱藏軟鍵盤方法

1.1 InputMethodManager類

Android中軟鍵盤的管理主要是通過InputMethodManager類來完成的。InputMethodManager對象的獲取方法如下:

InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

獲取到InputMethodManager對象後就可以通過調用其成員方法來對軟鍵盤進行操作。

1.2 顯示軟鍵盤方式

//方法一,推薦使用,注意editText必須獲得焦點
mInputMethodManager.showSoftInput(editText,0);
//方法二
mInputMethodManager.showSoftInputFromInputMethod(editText.getWindowToken(), 0); 
//方法三,切換軟鍵盤的顯示與隱藏  ,如果之前是隱藏的,則顯示;如果之前是顯示的,則隱藏
mInputMethodManager.toggleSoftInputFromWindow(0, 0); 

1.3 隱藏軟鍵盤方式

//方法一,切換軟鍵盤的顯示與隱藏  ,如果之前是隱藏的,則顯示;如果之前是顯示的,則隱藏
mInputMethodManager.toggleSoftInputFromWindow(0, 0); 
//方法二,推薦
mInputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); 
//方法三
mInputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); 

2 顯示軟鍵盤

一般我們推薦以下方法來顯示軟鍵盤

public boolean showSoftInput(View view, int flags);

它有兩個參數,第一個參數表示當前要接收軟鍵盤輸入的View,第二個參數是軟鍵盤顯示時的控制參數。使用InputMethodManager的showSoftInput()方法來顯示軟鍵盤有如下注意事項。

  • 第一個參數中view必須是EditText,或者EditText的子類,如果是其他類型的View,如Button,TextView等,showSoftInput()方法不起作用。

  • 第一個參數中的view必須是可以獲取焦點的(即view.isFocusable()返回true),如果不能獲取焦點,則showSoftInput()方法不起作用。EditText默認是可獲取焦點的,所以此條件一般都可以滿足。如果不滿足,可以通過view.setFocusable(true);將其設置爲可獲取焦點的View。

  • 第一個參數中的view當前必須已經獲取到焦點(即view.isFocused()返回true),如果當前焦點不在該view上,則showSoftInput()方法不起作用。雖然EditText默認是可獲取焦點的,但由於一個佈局中可能會有多個控件可以獲取焦點,焦點位置不一定會恰好在EditText上,所以此條件不一定滿足。爲了讓showSoftInput()可以起作用,必須在之前showSoftInput()前先通過view.requestFocus();獲取焦點。然後再執行showSoftInput()。

  • 第一個參數中的view必須是可見的,即view.getVisibility()等於View.VISIBLE,如果view是不可見的,無論view.getVisibility()是View.INVISIBLE還是View.GONE,showSoftInput()方法都不起作用。如果view是不可見的,可以先通過view.setVisibility(View.VISIBLE)將其設置爲可見。

  • 當前佈局必須已經完成加載,如果還未繪製完成,則showSoftInput()方法不起作用。特別的,在Activity的onCreate()中執行showSoftInput()是不起作用的。如果要再佈局文件加載後就顯示軟鍵盤,可以通過postDelayed的方式來延遲執行showSoftInput()。延遲時間不能太短,一般要在50ms以上。

  • 參照Android官方文檔,第二個參數提供一些額外的操作標記(additional operating flags),可以取0或者SHOW_IMPLICIT,0標記什麼含義沒有說明,SHOW_IMPLICIT表示本次顯示軟鍵盤的請求不是來自用戶的直接請求,而是隱式的請求。且不說一會用數字,一會用常量名,光SHOW_IMPLICIT的說明恐怕除了這個接口的開發人員,沒人能看懂這句話是什麼意思。實際上這個參數還可以取第三個值SHOW_FORCED,直接在文檔中被遺忘了。經過試驗,這個參數的取值對軟鍵盤的顯示沒有任何影響,無論取哪一個值軟鍵盤都能夠正常顯示(即使隨便輸入一個整數,軟鍵盤都可以顯示)。實際上這個參數影響的並不是軟鍵盤的顯示,而是軟鍵盤的隱藏,會在後文中講到。

3 隱藏軟鍵盤

一般我們推薦使用以下方法來隱藏軟鍵盤

public boolean hideSoftInputFromWindow(IBinder windowToken, int flags);

它同樣有兩個參數,第一個參數是一個View的windowToken。第二個參數是軟鍵盤隱藏時的控制參數。

使用InputMethodManager的hideSoftInputFromWindow方法來隱藏軟鍵盤有如下注意事項。

  • 第一個參數並不是指定一個View,而是一個View的windowToken。對一個view可以通過getWindowToken()的方法獲取到其windowToken。

  • 按照官方文檔,第一個參數中的windowToken應當是之前請求顯示軟鍵盤的View的windowToken,也就是執行showSoftInput()時第一個參數中的View的windowToken。但是實際情況是,用任意一個當前佈局中的已經加載的View的windowToken都可以隱藏軟鍵盤,哪怕這個View被設置爲INVISIBLE或GONE。因此,如果不知道之前是誰請求顯示的軟鍵盤,可以隨便傳入一個當前佈局中存在的View的windowToken。特別的,可以傳入一個Activity的頂層View的windowToken,即getWindow().getDecorView().getWindowToken(),來隱藏當前Activity中顯示的軟鍵盤,而不用管之前調用showSoftInput()的究竟是哪個View。示例代碼如下:

mInputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

這裏還要注意的是,可以隨便傳入一個當前佈局中存在的View的windowToken,並不代表可以傳入任意一個View的windowToken,如下代碼不能實現隱藏軟鍵盤:

mInputMethodManager.hideSoftInputFromWindow(new View(this).getWindowToken(), 0);

對新創建的view,必須將其加入到當前佈局中後纔可以用來隱藏軟鍵盤。

  • 參照Android官方文檔,第二個參數同樣是提供了一些額外的操作標記(additional operating flags),可以取0或者HIDE_IMPLICIT_ONLY,0標記同樣是什麼含義都沒有說明,HIDE_IMPLICIT_ONLY表示當前的軟鍵盤應當只在其不是被用戶顯式的顯示的時候才隱藏(the soft input window should only be hidden if it was not explicitly shown by the user)。這句話雖然很拗口,但總算是有點有用的信息了。在顯示軟鍵盤時,可以使用的flag有0,SHOW_IMPLICIT和SHOW_FORCED。如果隱藏軟鍵盤時使用的flag爲HIDE_IMPLICIT_ONLY,那麼只有當顯示軟鍵盤時指定的flag爲SHOW_IMPLICIT時,軟鍵盤纔會隱藏,如果顯示軟鍵盤時指定的flag不是SHOW_IMPLICIT,而是0或者SHOW_FORCED,那麼軟鍵盤就不會隱藏。爲了更完整的看出不同flag對隱藏軟鍵盤的影響(再聲明下,無論是顯示軟鍵盤時指定的flag,還是隱藏軟鍵盤時指定的flag都只對隱藏軟鍵盤有影響,對顯示軟鍵盤無影響), 分別在調用showSoftInput()時使用三個不同的標記,以及在調用hideSoftInputFromWindow()是使用三個不同的標記(隱藏軟鍵盤時同樣還有一個HIDE_NOT_ALWAYS標記,它同樣在文檔中被遺忘了),對是否能夠隱藏軟鍵盤進行測試,測試結果如下。T表示可以隱藏,F表示不能隱藏。
參數 0 SHOW_IMPLICIT SHOW_FORCED
0 T T T
HIDE_IMPLICIT_ONLY F T F
HIDE_NOT_ALWAYS T T F

可以看到,在隱藏軟鍵盤時使用HIDE_IMPLICIT_ONLY標記,確實只有在顯示軟鍵盤時使用SHOW_IMPLICIT時纔會隱藏。此外,當隱藏軟鍵盤時使用0作爲標記,無論showSoftInput()時使用的是哪個參數,都可以隱藏軟鍵盤。

切換軟鍵盤狀態

在InputMethodManager類中還提供了一個toggleSoftInput的方法來在顯示和隱藏軟鍵盤之間切換,也就是說,如果當前軟鍵盤是隱藏的,那麼執行toggleSoftInput方法時會顯示軟鍵盤,如果當前軟鍵盤是顯示的,那麼執行toggleSoftInput方法時會隱藏軟鍵盤。

public void toggleSoftInput(int showFlags, int hideFlags);

它同樣有兩個參數,第一個參數是顯示軟鍵盤時使用的標記,第二個參數是隱藏軟鍵盤時使用的標記。
使用InputMethodManager的toggleSoftInput()方法來切換軟鍵盤顯示狀態有如下注意事項。

  • showFlags爲顯示軟鍵盤時使用的標記,只有當前軟鍵盤處於隱藏狀態時纔會使用。hideFlags是隱藏軟鍵盤時使用的標記,只有當前軟鍵盤處於顯示狀態時纔會使用。

  • showFlags和hideFlags取值範圍,以及不同取值的影響和上文分析的一樣。即showFlags和hideFlags都隻影響軟鍵盤的隱藏,不影響軟鍵盤的顯示。不同取值對軟鍵盤隱藏的影響參見上文中的表格。

  • 和showSoftInput()方法不同的是,使用toggleSoftInput()顯示軟鍵盤時,並不要求當前界面佈局中有一個已經獲取焦點的EditText,即使當前佈局是完全空白的,一個View也沒有(除了最外層的Layout),toggleSoftInput也能夠顯示軟鍵盤。不過如果沒有一個已經獲取焦點的EditText,那麼軟鍵盤中的按鍵輸入都是無效的。

  • 顯示軟鍵盤時,要求當前佈局必須已經加載完成,如果還未繪製完成,則toggleSoftInput()方法不起作用。這點和之前調用showSoftInput()顯示軟鍵盤時描述的第5點要求是一樣的。特別的,在Activity的onCreate()中執行toggleSoftInput()必須通過postDelayed的方式來延遲執行。延遲時間一般要在50ms以上。

  • 當隱藏軟鍵盤時,不需要知道之前觸發軟鍵盤顯示的View是哪一個或獲取當前佈局中任何一個View的windowToken,只要hideFlags能夠隱藏就可以。由於hideFlags爲0時總是能夠隱藏的,因此,使用toggleSoftInput(0, 0)應當是最方便的無條件隱藏軟鍵盤的方法,前提是知道當前軟鍵盤確實是處於顯示狀態。不過遺憾的是Android沒有任何API可以直接獲取到軟鍵盤的狀態是顯示還是隱藏的。

參考

Android手動顯示和隱藏軟鍵盤方法總結

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