來去自如的 Keyboard,輸入就是這麼樸實無華又簡單
專案中常見讓用戶輸入文字的需求,元件 EditText 就提供了輸入文字和顯示輸入結果的功能。EditText 繼承自 TextView,預設的 Editable 屬性是 true。當使用者點選 EditText 取得焦點 ( request focus )後,系統會彈出 SoftKeyboard 供使用者操作,當輸入完成後可以點選鍵盤上的完成按鈕隱藏鍵盤,或是點選系統的 back key 也可以收起鍵盤。那如果沒有點選 EditText 前可以提前顯示鍵盤嗎?除了點鍵盤或是 back key 以外,還有其他可以隱藏鍵盤的方法嗎?一起來認識 Keyboard 的顯示管理吧!
預設顯示隱藏
有些需求是一開啟頁面就要顯示鍵盤,如果該頁面所在的 Activity 也只有單一頁面的話可以透過在 AndoirdMenifest 的 Activity 屬性 android:windowSoftInputMode
中,設定 stateVisible
達到預設顯示鍵盤的效果,通常會搭配 adjustResize
的設定讓系統在長出鍵盤的同時並調整顯示頁面,才不會導致部分頁面內容被鍵盤給擋住。
與 stateVisible
相反的是 stateHidden
可以預設隱藏鍵盤。雖然這個設定可以一勞永逸,但假如是一個 Activity 搭配多個 Fragment 的情況,只有部分 Fragment 需要預設顯示鍵盤,可以透過在該 Fragment 的 EditText 試圖獲取焦點時加上延遲,例如:
findViewById(R.id.editComment).postDelayed(
new Runnable() {
public void run() {
editText.requestFocus();
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
}
},100);
沒有加上延遲前因為在 AndroidMenifest 設定 stateHidden
是預設隱藏鍵盤,就算直接 requestFocus() 和呼叫 InputMethodManager.showSoftInput 也無法顯示鍵盤,但加上延遲後相當於延遲的時間後再獲取焦點顯示鍵盤,與 stateHidden
的設定並不衝突。
在 Android 的世界中對鍵盤的管理並不輕鬆,需要透過 InputMethodManager
的介面並傳入 context 以及要顯示或隱藏鍵盤的 View 或是 Window,才能執行 showSoftInput
或是 hideSoftInputFromWindow
。
熱騰騰的 Keyboard 管理介面
雖然有 InputMethodmanager 可以管理鍵盤顯示,但不是應該要有更直覺、更齁用的 API 例如 Keyboard.show() 和 Keyboard.hide() 嗎?廣大開發者們的心聲 Google 都有聽到!在熱騰騰的 Android 11 新增了 WindowInsetsController
的介面,提供 showInputMethod()
和 hideInputMethod()
更為直覺的 API,開發者再也不用辛苦地傳入 context 和 View 了!WindowInsetsController
還有設定 status bar 外觀的功能,期待未來系統資源也都能像新推出的介面一樣讓開發者更方便調用。