android:windowSoftInputMode屬性詳解,
在前面的一篇文章中,簡單的介紹了一下如何?軟鍵盤不自動彈出,使用的方法是設定android:windowSoftInputMode屬性。那麼,這個屬性到底是幹什麼的,他有什麼作用呢?今天這篇文章,就是探索android:windowSoftInputMode屬性的作用的。
首先,我們從這個屬性的名稱中,可以很直觀的看出它的作用,這個屬性就是來設定視窗軟鍵盤的互動模式的。
android:windowSoftInputMode屬性一共有9個取值,分別是:
stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。
我們設定屬性的時候,可以在這9個值裡面選擇一個,也可以用"state...|adjust"的形式進行設定。那麼,這些取值到底是怎麼影響到軟鍵盤與視窗之間的互動的呢?下面,我們就一個個的測試這9個取值,到底是如何影響軟鍵盤的顯示的。
1.stateUnspecified
中文意思是未指定狀態,當我們沒有設定android:windowSoftInputMode屬性的時候,軟體預設採用的就是這種互動方式,系統會根據介面採取相應的軟鍵盤的顯示模式,比如,當介面上只有文本和按鈕的時候,軟鍵盤就不會自動彈出,因為沒有輸入的必要。那麼,當介面上出現了擷取了焦點的輸入框的時候,軟鍵盤會不會自動的彈出呢?這個還真不一定!比如,在下面的這個介面布局中,軟鍵盤並不會自動彈出。
就是說,預設的,在這種介面情況下,系統並不確定使用者是否需要軟鍵盤,因此不會自動彈出。但是,為什麼說不一定呢?這是因為,如果我們在這個布局的外面,包裹上一個
ScrollView,軟鍵盤就會自動的彈出來了!
如下,在這種布局檔案下,軟鍵盤會自動的彈出
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="toOther" android:text="跳轉" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView></LinearLayout>
這確實是一個很奇怪的判斷方式。因此,我們可以得出結論,當設定屬性為stateUnspecified的時候,系統是預設不彈出軟鍵盤的,但是當有獲得焦點的輸入框的介面有滾動的需求的時候,會自動彈出軟鍵盤。至於為什麼非要強調要擷取焦點的輸入框,這是因為,如果不是輸入框擷取焦點,軟鍵盤也是不會自動彈出的,讓介面不自動彈出軟鍵盤的其中一個解決方案,就是在xml檔案中,設定一個非輸入框控制項擷取焦點,從而阻止鍵盤彈出。
2.stateUnchanged
中文的意思就是狀態不改變的意思,我們應該怎麼理解這句話呢?其實很好理解,就是說,當前介面的軟鍵盤狀態,取決於上一個介面的軟鍵盤狀態。舉個例子,假如當前介面鍵盤是隱藏的,那麼跳轉之後的介面,軟鍵盤也是隱藏的;如果當前介面是顯示的,那麼跳轉之後的介面,軟鍵盤也是顯示狀態。
3.stateHidden
顧名思義,如果我們設定了這個屬性,那麼鍵盤狀態一定是隱藏的,不管上個介面什麼狀態,也不管當前介面有沒有輸入的需求,反正就是不顯示。因此,我們可以設定這個屬性,來控制軟鍵盤不自動的彈出。
4.stateAlwaysHidden
這個屬性也可以讓軟鍵盤隱藏,但是我暫時還不知道和stateHidden屬性的區別,本來想去stackOverFlow上問一下的,但是,Great Wall,呵呵呵...祝願病魔早日戰勝方校長
5.stateVisible
設定為這個屬性,可以將軟鍵盤召喚出來,即使在介面上沒有輸入框的情況下也可以強制召喚出來。
6.stateAlwaysVisible
這個屬性也是可以將鍵盤召喚出來,但是與stateVisible屬性有小小的不同之處。舉個例子,當我們設定為stateVisible屬性,如果當前的介面鍵盤是顯示的,當我們點擊按鈕跳轉到下個介面的時候,軟鍵盤會因為輸入框失去焦點而隱藏起來,當我們再次回到當前介面的時候,鍵盤這個時候是隱藏的。但是如果我們設定為stateAlwaysVisible,我們跳轉到下個介面,軟鍵盤還是隱藏的,但是當我們再次回來的時候,軟鍵盤是會顯示出來的。所以,這個Always就解釋了這個區別,不管什麼情況到達當前介面(正常跳轉或者是上一個介面被使用者返回),軟鍵盤都是顯示狀態。
說到這裡,我聯想到了上面的stateHidden和stateAlwaysHidden,我估計區別也是這樣的,就是說,stateAlwaysHidden無論如何都是隱藏的,但是如果在跳轉到下個介面的時候,軟鍵盤被召喚出來了,那麼當下個介面被使用者返回的時候,鍵盤應該是不會被隱藏的,但是,我還沒有找到能夠跳轉到下個介面,還讓當前介面軟鍵盤不消失的方法,所以暫時不能驗證。
7.adjustUnspecified
從這個屬性開始,就不是設定軟鍵盤的顯示與隱形模式了,而是設定軟鍵盤與軟體的顯示內容之間的顯示關係。當你跟我們沒有設定這個值的時候,這個選項也是預設的設定模式。在這中情況下,系統會根據介面選擇不同的模式。如果介面裡面有可以滾動的控制項,比如ScrowView,系統會減小可以滾動的介面的大小,從而保證即使軟鍵盤顯示出來了,也能夠看到所有的內容。如果布局裡面沒有滾動的控制項,那麼軟鍵盤可能就會蓋住一些內容,我們從下面的圖中可以看出差別。
沒有滾動控制項,軟鍵盤下面的布局都被遮擋住了,若想修改,只能隱藏軟鍵盤,然後選擇。而且,重點注意一下上面的布局,當我們選擇的輸入框偏下的時候,上面的標題列和布局被軟鍵盤頂上去了。記住這個特徵,因為後面有個屬性和這個的效果不一樣。
布局裡面有滑動控制項,系統會自動的縮小整個介面的大小,因此,我們可以軟鍵盤上面的小地區中顯示所有的輸入框。
這就是兩中顯示模式之間的差別。
8.adjustResize
這個屬性工作表示Activity的主視窗總是會被調整大小,從而保證軟鍵盤顯示空間。
我們先看顯示效果。
注意觀察這個上面的標題列和按鈕,設定為adjustResize屬性之後,對於沒有滑動控制項的布局,雖然還是不能選擇所有的輸入框,但是,視窗的顯示方式發生了變化,預設屬性時,整個布局是被頂上去了,但是設定為adjustResize屬性,布局的位置並沒有發生什麼變化,這就是最大的區別。
而對於有滑動控制項的布局來說,顯示效果和預設是一樣的。
9.adjustPan
如果設定為這個屬性,那麼Activity的螢幕大小並不會調整來保證軟鍵盤的空間,而是採取了另外一種策略,系統會通過布局的移動,來保證使用者要進行輸入的輸入框肯定在使用者的失業範圍裡面,從而讓使用者可以看到自己輸入的內容。對於沒有滾動控制項的布局來說,這個其實就是預設的設定,如果我們選擇的位置偏下,上面的標題列和部分控制項會被頂上去。但是對於有滾動控制項的布局來說,則不太一樣,我們看下面的。
首先,這是軟鍵盤沒有彈出的時候,有滾動控制項的顯示範圍,最下面顯示的是9.
當我們點擊5這個輸入框,我們會發現下面的現象。
最上面只能夠顯示到按鈕,標題列已經不能看到了。
而最下面也只能滑動到8,下面的內容也不能夠滑動了。
因此,我們就能夠理解這個屬性的作用了。
通過以上的實驗,我們可以得出結論,如果我們不設定"adjust..."的屬性,對於沒有滾動控制項的布局來說,採用的是adjustPan方式,而對於有滾動控制項的布局,則是採用的adjustResize方式。
瞭解了上面的這些知識之後,我們就可以根據自己的需求設定不同的方式了。而且,關於如何使得介面載入的時候不顯示軟鍵盤,我們也有了一個很清楚的認識。
晚安,在假期裡還在奮鬥的程式員們。
問以前你提的問題:android開發:軟鍵盤顯示的時把布局往上頂是怎解決的?是布局問題?
我把內容用ScrollView 套起來,在軟體盤彈出之後用代碼控制ScrollView的捲軸位置,將捲軸定位在內容部分
Android activity全屏 IME遮蓋輸入框 (全屏下windowSoftInputMode屬性失效)有沒有辦法讓輸入框顯示
網上有很多類似的例子,你去找一個QQ空間的登陸介面,彈出IME時,輸入框向上縮,就不會被遮住了