【Android】軟鍵盤的顯示與隱藏相關(guān)的一切

鍵盤的展開和收起主要使用到類InputMethodManager

//
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
//隱藏
if(inputMethodManager == null) {
    return;
}
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
//展示
inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);

參數(shù):

  1. public static final int HIDE_IMPLICIT_ONLY
    hideSoftInputFromWindow(IBinder, int)中的標(biāo)志,表示如果用戶未顯式地顯示軟鍵盤窗口,則隱藏窗口。
    常量值: 1 (0x00000001)
  2. public static final int HIDE_NOT_ALWAYS
    hideSoftInputFromWindow(IBinder, int)中的標(biāo)志,表示軟鍵盤窗口總是隱藏,除非開始時(shí)以SHOW_FORCED顯示。
    常量值: 2 (0x00000002)
  3. public static final int SHOW_FORCED
    showSoftInput(View, int)標(biāo)志,表示用戶強(qiáng)制打開輸入法(如長(zhǎng)按菜單鍵),一直保持打開直至只有顯式關(guān)閉。
    常量值: 2 (0x00000002)
  4. public static final int SHOW_IMPLICIT
    showSoftInput(View, int)標(biāo)志,表示隱式顯示輸入窗口,非用戶直接要求。窗口可能不顯示。
    常量值: 1 (0x00000001)
  5. 除此外還有0這個(gè)參數(shù),文檔未見做解釋

關(guān)于顯示鍵盤一些注意點(diǎn):

  1. 第一個(gè)參數(shù)中view必須是EditText,或者EditText的子類,如果是其他類型的View,如Button,TextView等,showSoftInput()方法不起作用。
  2. 第一個(gè)參數(shù)中的view必須是可以獲取焦點(diǎn)的(即view.isFocusable()返回true),如果不能獲取焦點(diǎn),則showSoftInput()方法不起作用。EditText默認(rèn)是可獲取焦點(diǎn)的,所以此條件一般都可以滿足。如果不滿足,可以通過view.setFocusable(true);將其設(shè)置為可獲取焦點(diǎn)的View。
  3. 第一個(gè)參數(shù)中的view當(dāng)前必須已經(jīng)獲取到焦點(diǎn)(即view.isFocused()返回true),如果當(dāng)前焦點(diǎn)不在該view上,則showSoftInput()方法不起作用。雖然EditText默認(rèn)是可獲取焦點(diǎn)的,但由于一個(gè)布局中可能會(huì)有多個(gè)控件可以獲取焦點(diǎn),焦點(diǎn)位置不一定會(huì)恰好在EditText上,所以此條件不一定滿足。為了讓showSoftInput()可以起作用,必須在之前showSoftInput()前先通過view.requestFocus();獲取焦點(diǎn)。然后再執(zhí)行showSoftInput()。
  4. 第一個(gè)參數(shù)中的view必須是可見的,即view.getVisibility()等于View.VISIBLE,如果view是不可見的,無(wú)論view.getVisibility()是View.INVISIBLE還是View.GONE,showSoftInput()方法都不起作用。如果view是不可見的,可以先通過view.setVisibility(View.VISIBLE)將其設(shè)置為可見。
  5. 布局完成后才生效。延遲生效
getWindow().getDecorView().postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            view.requestFocus();
            imm.showSoftInput(view, 0);
        }
    }
}, 100);

關(guān)于隱藏鍵盤一些注意點(diǎn):

  1. getWindow().getDecorView().getWindowToken()可以直接隱藏當(dāng)前Activity的鍵盤,也可以任意已展示在布局上的view的getWindowToken()
  2. 常量參數(shù)對(duì)隱藏是否成功有影響,可見上邊常量的介紹,做表如下


    隱藏成功(T)對(duì)照

切換顯示與隱藏

public void toggleSoftInput(int showFlags, int hideFlags);

類似于顯示和隱藏的傳參,用于切換,但是不需要有輸入框,也不需要傳WindowToken,會(huì)直接顯示和隱藏。

總結(jié)

大部分情景都是要直接隱藏鍵盤的,所以參數(shù)直接用0就必然能關(guān)閉鍵盤了。

Tips

關(guān)于顯示與隱藏的監(jiān)聽
windowSoftInputMode設(shè)置及常見問題解答
簡(jiǎn)單的說(shuō)
在項(xiàng)目的AndroidManifest.xml文件中界面對(duì)應(yīng)的<activity>里
android:windowSoftInputMode="stateVisible|adjustResize",這樣會(huì)讓屏幕整體上移。
android:windowSoftInputMode="adjustPan"這樣鍵盤就會(huì)覆蓋屏幕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容