Android Keyboard 顯示管理


來去自如的 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 外觀的功能,期待未來系統資源也都能像新推出的介面一樣讓開發者更方便調用。

#Android #Keyboard







你可能感興趣的文章

Node.js

Node.js

CSS保健室|為什麼position:sticky不起作用?

CSS保健室|為什麼position:sticky不起作用?

[06] JavaScript 入門 - 拉升、嚴格模式

[06] JavaScript 入門 - 拉升、嚴格模式






留言討論