記一次頁面有EditText時,鍵盤彈出的問題

smartsean發表於2017-12-20

記一次頁面有EditText時,鍵盤彈出的問題

先來看一下在 Manifest 檔案裡面的 Activity 裡面的這個屬性

android:windowSoftInputMode="adjustPan|stateHidden"
複製程式碼

以下介紹部分屬於來自官方文件

這個屬性是 Android 1.5之後推出的,主要是為了 Activity 與軟鍵盤的互動,主要的作用有兩個:

  • 當 Activity 成為使用者注意的焦點時軟鍵盤的狀態 — 隱藏還是可見。
  • 對 Activity 主視窗所做的調整 — 是否將其尺寸調小以為軟鍵盤騰出空間,或者當視窗部分被軟鍵盤遮擋時是否平移其內容以使當前焦點可見。

該設定必須是下表所列的值之一,或者是一個“state...”值加上一個“adjust...”值的組合。 在任一組中設定多個值(例如,多個“state...”值)都會產生未定義結果。各值之間使用垂直條 (|) 分隔。

這裡的意思就是,正常會有下面的幾種組合形式

  1. adjust...
  2. adjust...+state...
  3. state...

而不能寫成

  • adjust...
  • state...

比如

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
複製程式碼

屬性介紹:

  1. stateUnspecified:不指定軟鍵盤的狀態(隱藏還是可見)。 將由系統選擇合適的狀態,或依賴主題中的設定。這是對軟鍵盤行為的預設設定。
  2. stateUnchanged:當這個 activity 出現時,軟鍵盤將一直保持在上一個 activity 裡的狀態,無論是隱藏還是顯示
  3. stateHidden:使用者選擇開啟新 activity 時,軟鍵盤總是被隱藏,如果是從另外一個 Activity 返回時,採用預設值(官網描述:當使用者選擇 Activity 時 — 也就是說,當使用者確實是向前導航到 Activity,而不是因離開另一 Activity 而返回時 — 隱藏軟鍵盤。)
  4. stateAlwaysHidden:當該 Activity 主視窗獲取焦點時,軟鍵盤也總是被隱藏的
  5. stateVisible:在正常的適宜情況下(當使用者向前導航到 Activity 的主視窗時)顯示軟鍵盤。
  6. stateAlwaysVisible:當使用者選擇 Activity 時 — 也就是說,當使用者確實是向前導航到 Activity,而不是因離開另一 Activity 而返回時 — 顯示軟鍵盤。
  7. adjustUnspecified:預設設定,通常由系統自行決定是隱藏還是顯示(官網描述:不指定 Activity 的主視窗是否調整尺寸以為軟鍵盤騰出空間,或者視窗內容是否進行平移以在螢幕上顯露當前焦點。 系統會根據視窗的內容是否存在任何可滾動其內容的佈局檢視來自動選擇其中一種模式。 如果存在這樣的檢視,視窗將進行尺寸調整,前提是可通過滾動在較小區域內看到視窗的所有內容。 這是對主視窗行為的預設設定。)
  8. adjustResize:該 Activity 總是調整螢幕的大小以便留出軟鍵盤的空間
  9. adjustPan:當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分(官網描述:不調整 Activity 主視窗的尺寸來為軟鍵盤騰出空間, 而是自動平移視窗的內容,使當前焦點永遠不被鍵盤遮蓋,讓使用者始終都能看到其輸入的內容。 這通常不如尺寸調正可取,因為使用者可能需要關閉軟鍵盤以到達被遮蓋的視窗部分或與這些部分進行互動。)

我遇到的問題

我在首頁點選按鈕進入下個頁面,進去之後自動彈出軟鍵盤,返回頁主頁面有兩種方式

方式一

按返回鍵,先收起軟鍵盤,再按一次,返回主頁面,這種情況是沒有問題的

方式二

直接點選導航欄的返回按鈕,返回主頁面,這種情況確實返回了主頁面,但是軟鍵盤卻沒有自動收起。我主頁面的 Activity 是設定的

android:windowSoftInputMode="adjustPan|stateHidden"
複製程式碼

設定成這兩個屬性是因為主頁面有個輸入框,如果不設定的話,輸入框彈起的時候,會把底部的 tab 欄頂上來。

從上面的屬性說明來看,adjustPan 是正常的,可以很好的解決我鍵盤彈出時,把底部 tab 欄頂上來的 bug,

那麼問題主要就出在 stateHiden 這裡,由於我這個是主頁面,首次進來的時候軟鍵盤是被隱藏的,如果我從主頁面進入 ActivityA ,在ActivityA 裡面有輸入框,我直接點選左上角的返回按鈕回到主頁面,軟鍵盤並不會被隱藏,還是出現在頁面中,

最終解決辦法:

由於這個是主頁面,我們想要每次進來的時候,軟鍵盤都是被隱藏的,只需要把 stateHidden 換成 stateAlwaysHidden 或者直接刪掉就好了。

你可以通過以下方式關注我:

  1. CSDN
  2. 掘金
  3. 個人部落格
  4. Github

相關文章