本文參照 Android 軟鍵盤的顯示和隱藏梢莽,這樣操作就對(duì)了進(jìn)行整理修正
Android軟鍵盤系列:
我們使用InputMethodManager來實(shí)現(xiàn)Android中顯示和隱藏軟鍵盤的工作惨篱,幾句代碼就可以完成顯示和隱藏鍵盤的操作寇损,比較簡(jiǎn)單州疾。
個(gè)人認(rèn)為有兩個(gè)點(diǎn)需要大家先留意一下:
- 布局必須加載完成剂习。在 onCreate() 中胧奔,如果立即調(diào)用 showSoftInput() 是不會(huì)生效的逊移。想要在頁面一啟動(dòng)的時(shí)候就彈出鍵盤,可以在 Activity 上葡盗,設(shè)置 android:windowSoftInputMode 屬性來完成螟左,或者做一個(gè)延遲加載,View.postDelayed() 也是一個(gè)解決方案觅够。
- 調(diào)用隱藏鍵盤的方法hideSoftInputFromWindow()時(shí)胶背,第一個(gè)參數(shù)理論上需要傳遞彈出鍵盤相應(yīng)的View的windowToken ,但實(shí)際情況是你只需要傳遞一個(gè)存在于當(dāng)前布局 ViewTree 中喘先,隨意一個(gè) View 的 windowToken就可以了
以下進(jìn)行詳細(xì)介紹
1. Show Keyboard
先上代碼
public static void showKeyboard(View view) {
InputMethodManager imm = (InputMethodManager) view.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
view.requestFocus();
imm.showSoftInput(view, 0);
}
}
調(diào)用InputMethodManager的showSoftInput()可以實(shí)現(xiàn)顯示鍵盤钳吟,先來看看它的兩個(gè)參數(shù)。
View: 使用軟鍵盤就是為了輸入窘拯,而輸入就需要有接收輸入內(nèi)容的 View 红且,這里接收輸入的 View 坝茎,最好是一個(gè) EditText(但這不是必須的)。
flags: flags 就是個(gè)標(biāo)志位暇番,從上面截圖的方法簽名上的文檔上可以看到嗤放,它接收 0 或者 SHOW_INPYT_IMPLICIT 兩個(gè)參數(shù),但是實(shí)際上壁酬,它有第三個(gè)參數(shù)次酌,另外一個(gè)是 SHOW_FORCED。
以下是需要注意的使showSoftInput生效的關(guān)鍵點(diǎn):
- 第一個(gè)參數(shù)舆乔,最好是 EditText 或者它的子類岳服。
考慮到軟鍵盤就是為了輸入,EditText 就是一個(gè)接收輸入的控件希俩。而這不是絕對(duì)的吊宋,如果不是一個(gè) EditText ,就必須要求這個(gè) View 有兩個(gè)屬性颜武,分別是:android:focusable="true" 和android:focusableInTouchMode="true"璃搜。 - 第一個(gè)參數(shù),必須是可獲取焦點(diǎn)的盒刚,并且當(dāng)前已經(jīng)獲取到焦點(diǎn)腺劣。
EditText 默認(rèn)是允許獲取焦點(diǎn)的,但是假如布局中因块,存在多個(gè)可獲取焦點(diǎn)的控件,就需要提前讓我們傳遞進(jìn)去的 View 獲取到焦點(diǎn)籍铁。獲取焦點(diǎn)可以使用 requestFocus() 方法涡上。 - 布局必須加載完成。
在 onCreate() 中拒名,如果立即調(diào)用 showSoftInput() 是不會(huì)生效的吩愧。想要在頁面一啟動(dòng)的時(shí)候就彈出鍵盤,可以在 Activity 上增显,設(shè)置 android:windowSoftInputMode 屬性來完成雁佳,或者做一個(gè)延遲加載,View.postDelayed() 也是一個(gè)解決方案同云。
打開Activity時(shí)默認(rèn)下打開或關(guān)閉軟鍵盤糖权,可以通過設(shè)置清單文件實(shí)現(xiàn)
<activity
android:name=".ActivityKeyboardActivity"
android:windowSoftInputMode="stateVisible"
/>
stateVisible:打開。
stateHidden:關(guān)閉(默認(rèn))炸站。
2. Hide Keyboard
先上代碼
public static void hideKeyboard(View view){
InputMethodManager imm = (InputMethodManager) view.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(),0);
}
}
同樣來看看hideSoftInputFromWindow的兩個(gè)參數(shù)星澳。
IBinder: 可以直接傳遞一個(gè) View.getWindowToken() 的 windowToken 對(duì)象就可以了
flags: 隱藏軟鍵盤的標(biāo)志位,如果沒有特殊要求的話旱易,直接傳遞 0 就好了禁偎。
注意: 第一參數(shù)理論上需要傳遞彈出鍵盤相應(yīng)的View的windowToken 腿堤,但實(shí)際情況是你只需要傳遞一個(gè)存在于當(dāng)前布局 ViewTree 中,隨意一個(gè) View 的 windowToken 就可以了
如上圖所示如暖,鍵盤是由第一個(gè)Edittext聚焦后彈出的笆檀,當(dāng)點(diǎn)擊Hide Keyboard按鈕調(diào)用hideSoftInputFromWindow方法時(shí),第一個(gè)參數(shù)傳的是第二個(gè)Edittext的windowToken 盒至,但也能把鍵盤隱藏掉酗洒。
3. 切換鍵盤的彈出和隱藏
在 InputMethodManager 中,還提供了一個(gè) toggleSoftInput() 方法妄迁,如同它的名字一樣寝蹈,它可以讓軟鍵盤在顯示和隱藏之間切換。
雖然這個(gè)方法登淘,限制很少箫老,但是我們基本上不會(huì)使用它。主要原因在于黔州,它是一個(gè)開關(guān)的方法耍鬓,會(huì)根據(jù)當(dāng)前的狀態(tài)做相反的操作。這就導(dǎo)致很多時(shí)候流妻,我們?cè)诖a中牲蜀,無法直接根據(jù) InputMethodManager 提供的方法判斷當(dāng)前軟鍵盤的顯示狀態(tài),這樣也就無法確定調(diào)用它的時(shí)候的效果了绅这。
4. 如何判斷鍵盤是否彈出
InputMethodManager 沒有提供判斷鍵盤是否彈出的調(diào)用方法涣达,如果想要監(jiān)聽鍵盤的彈出和收起,可以使用 ViewTreeObserver.OnGlobalLayoutListener 這個(gè)監(jiān)聽证薇,來監(jiān)聽布局的調(diào)整度苔,從而判斷出鍵盤的彈出和隱藏。
這一點(diǎn)我在Android軟鍵盤-彈起時(shí)布局向上拉-登錄界面時(shí)有提及浑度,有興趣的可以去看看寇窑。