Android軟鍵盤-顯示隱藏軟鍵盤

本文參照 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ù)。


image.png

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ù)星澳。

image.png

IBinder: 可以直接傳遞一個(gè) View.getWindowToken() 的 windowToken 對(duì)象就可以了
flags: 隱藏軟鍵盤的標(biāo)志位,如果沒有特殊要求的話旱易,直接傳遞 0 就好了禁偎。
注意: 第一參數(shù)理論上需要傳遞彈出鍵盤相應(yīng)的View的windowToken 腿堤,但實(shí)際情況是你只需要傳遞一個(gè)存在于當(dāng)前布局 ViewTree 中,隨意一個(gè) View 的 windowToken 就可以了
image.png

如上圖所示如暖,鍵盤是由第一個(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í)有提及浑度,有興趣的可以去看看寇窑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市箩张,隨后出現(xiàn)的幾起案子甩骏,更是在濱河造成了極大的恐慌,老刑警劉巖先慷,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饮笛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡熟掂,警方通過查閱死者的電腦和手機(jī)缎浇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赴肚,“玉大人素跺,你說我怎么就攤上這事二蓝。” “怎么了指厌?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵刊愚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我踩验,道長(zhǎng)鸥诽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任箕憾,我火速辦了婚禮牡借,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袭异。我一直安慰自己钠龙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布御铃。 她就那樣靜靜地躺著碴里,像睡著了一般。 火紅的嫁衣襯著肌膚如雪上真。 梳的紋絲不亂的頭發(fā)上咬腋,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音睡互,去河邊找鬼根竿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛就珠,可吹牛的內(nèi)容都是我干的犀填。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗓违,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了图贸?” 一聲冷哼從身側(cè)響起蹂季,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疏日,沒想到半個(gè)月后偿洁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沟优,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年涕滋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠阁。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宾肺,死狀恐怖溯饵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锨用,我是刑警寧澤丰刊,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站增拥,受9級(jí)特大地震影響啄巧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掌栅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一秩仆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猾封,春花似錦澄耍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枚钓,卻和暖如春铅搓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搀捷。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工星掰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫩舟。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓氢烘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親家厌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子播玖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容