android:windowSoftInputMode屬性詳解

來源:互聯網
上載者:User

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,軟鍵盤就會自動的彈出來了!

如下,在這種布局檔案下,軟鍵盤會自動的彈出

                                                

這確實是一個很奇怪的判斷方式。因此,我們可以得出結論,當設定屬性為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,系統會減小可以滾動的介面的大小,從而保證即使軟鍵盤顯示出來了,也能夠看到所有的內容。如果布局裡面沒有滾動的控制項,那麼軟鍵盤可能就會蓋住一些內容,我們從下面的圖中可以看出差別。


沒有滾動控制項,軟鍵盤下面的布局都被遮擋住了,若想修改,只能隱藏軟鍵盤,然後選擇。而且,重點注意一下上面的布局,當我們選擇的輸入框偏下的時候,上面的標題列和布局被軟鍵盤頂上去了。記住這個特徵,因為後面有個屬性和這個的效果不一樣。


布局裡面有滑動控制項,系統會自動的縮小整個介面的大小,因此,我們可以軟鍵盤上面的小地區中顯示所有的輸入框。


<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgY2xhc3M9"p1">

這就是兩中顯示模式之間的差別。


8.adjustResize

這個屬性工作表示Activity的主視窗總是會被調整大小,從而保證軟鍵盤顯示空間。

我們先看顯示效果。

注意觀察這個上面的標題列和按鈕,設定為adjustResize屬性之後,對於沒有滑動控制項的布局,雖然還是不能選擇所有的輸入框,但是,視窗的顯示方式發生了變化,預設屬性時,整個布局是被頂上去了,但是設定為adjustResize屬性,布局的位置並沒有發生什麼變化,這就是最大的區別。




而對於有滑動控制項的布局來說,顯示效果和預設是一樣的。



9.adjustPan

如果設定為這個屬性,那麼Activity的螢幕大小並不會調整來保證軟鍵盤的空間,而是採取了另外一種策略,系統會通過布局的移動,來保證使用者要進行輸入的輸入框肯定在使用者的失業範圍裡面,從而讓使用者可以看到自己輸入的內容。對於沒有滾動控制項的布局來說,這個其實就是預設的設定,如果我們選擇的位置偏下,上面的標題列和部分控制項會被頂上去。但是對於有滾動控制項的布局來說,則不太一樣,我們看下面的。

首先,這是軟鍵盤沒有彈出的時候,有滾動控制項的顯示範圍,最下面顯示的是9.



當我們點擊5這個輸入框,我們會發現下面的現象。

最上面只能夠顯示到按鈕,標題列已經不能看到了。



而最下面也只能滑動到8,下面的內容也不能夠滑動了。



因此,我們就能夠理解這個屬性的作用了。


通過以上的實驗,我們可以得出結論,如果我們不設定"adjust..."的屬性,對於沒有滾動控制項的布局來說,採用的是adjustPan方式,而對於有滾動控制項的布局,則是採用的adjustResize方式。


瞭解了上面的這些知識之後,我們就可以根據自己的需求設定不同的方式了。而且,關於如何使得介面載入的時候不顯示軟鍵盤,我們也有了一個很清楚的認識。

晚安,在假期裡還在奮鬥的程式員們。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.