1. 程式人生 > >【Android開發經驗】android:windowSoftInputMode屬性具體解釋

【Android開發經驗】android:windowSoftInputMode屬性具體解釋

中一 mtk wid water ren 而是 orien 表示 不能

本文章來自CSDN博客:http://blog.csdn.net/zhaokaiqiang1992。轉載請註明地址!

在前面的一篇文章中,簡單的介紹了一下怎樣實現軟鍵盤不自己主動彈出,使用的方法是設置android:windowSoftInputMode屬性。

那麽,這個屬性究竟是幹什麽的,他有什麽作用呢?今天這篇文章。就是探索android:windowSoftInputMode屬性的作用的。

首先,我們從這個屬性的名稱中,能夠非常直觀的看出它的作用,這個屬性就是來設置窗體軟鍵盤的交互模式的。

android:windowSoftInputMode屬性一共同擁有9個取值。各自是:

stateUnspecified,stateUnchanged。stateHidden,stateAlwaysHidden。stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize。adjustPan。

我們設置屬性的時候。能夠在這9個值裏面選擇一個。也能夠用"state...|adjust"的形式進行設置。那麽,這些取值究竟是怎麽影響到軟鍵盤與窗體之間的交互的呢?以下。我們就一個個的測試這9個取值。究竟是怎樣影響軟鍵盤的顯示的。

1.stateUnspecified

中文意思是未指定狀態,當我們沒有設置android:windowSoftInputMode屬性的時候,軟件默認採用的就是這樣的交互方式,系統會依據界面採取對應的軟鍵盤的顯示模式。比方。當界面上僅僅有文本和button的時候,軟鍵盤就不會自己主動彈出。由於沒有輸入的必要。

那麽。當界面上出現了獲取了焦點的輸入框的時候。軟鍵盤會不會自己主動的彈出呢?這個還真不一定!

比方,在以下的這個界面布局中。軟鍵盤並不會自己主動彈出。

技術分享圖片

就是說。默認的,在這樣的界面情況下,系統並不確定用戶是否須要軟鍵盤,因此不會自己主動彈出。

可是,為什麽說不一定呢?這是由於,假設我們在這個布局的外面,包裹上一個

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屬性,假設當前的界面鍵盤是顯示的,當我們點擊button跳轉到下個界面的時候,軟鍵盤會由於輸入框失去焦點而隱藏起來,當我們再次回到當前界面的時候,鍵盤這個時候是隱藏的。可是假設我們設置為stateAlwaysVisible,我們跳轉到下個界面,軟鍵盤還是隱藏的,可是當我們再次回來的時候。軟鍵盤是會顯示出來的。

所以。這個Always就解釋了這個差別,無論什麽情況到達當前界面(正常跳轉或者是上一個界面被用戶返回)。軟鍵盤都是顯示狀態。

講到這裏。我聯想到了上面的stateHidden和stateAlwaysHidden。我預計差別也是這種。就是說。stateAlwaysHidden不管怎樣都是隱藏的,可是假設在跳轉到下個界面的時候。軟鍵盤被召喚出來了。那麽當下個界面被用戶返回的時候,鍵盤應該是不會被隱藏的,可是,我還沒有找到可以跳轉到下個界面,還讓當前界面軟鍵盤不消失的方法。所以臨時不能驗證。

7.adjustUnspecified

從這個屬性開始。就不是設置軟鍵盤的顯示與隱藏模式了,而是設置軟鍵盤與軟件的顯示內容之間的顯示關系。當你跟我們沒有設置這個值的時候,這個選項也是默認的設置模式。在這中情況下,系統會依據界面選擇不同的模式。假設界面裏面有能夠滾動的控件,比方ScrowView。系統會減小能夠滾動的界面的大小,從而保證即使軟鍵盤顯示出來了,也能夠看到全部的內容。假設布局裏面沒有滾動的控件。那麽軟鍵盤可能就會蓋住一些內容,我們從以下的圖中能夠看出區別。

沒有滾動控件,軟鍵盤以下的布局都被遮擋住了,若想改動,僅僅能隱藏軟鍵盤。然後選擇。並且,重點註意一下上面的布局,當我們選擇的輸入框偏下的時候,上面的標題欄和布局被軟鍵盤頂上去了。

記住這個特征,由於後面有個屬性和這個的效果不一樣。

技術分享圖片

布局裏面有滑動控件,系統會自己主動的縮小整個界面的大小。因此,我們能夠軟鍵盤上面的小區域中顯示全部的輸入框。

技術分享圖片

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

8.adjustResize

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

我們先看顯示效果。

註意觀察這個上面的標題欄和button,設置為adjustResize屬性之後,對於沒有滑動控件的布局。盡管還是不能選擇全部的輸入框。可是,窗體的顯示方式發生了變化,默認屬性時,整個布局是被頂上去了,可是設置為adjustResize屬性。布局的位置並沒有發生什麽變化。這就是最大的差別。

技術分享圖片

而對於有滑動控件的布局來說,顯示效果和默認是一樣的。

技術分享圖片

9.adjustPan

假設設置為這個屬性。那麽Activity的屏幕大小並不會調整來保證軟鍵盤的空間。而是採取了第二種策略,系統會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的失業範圍裏面,從而讓用戶能夠看到自己輸入的內容。對於沒有滾動控件的布局來說。這個事實上就是默認的設置,假設我們選擇的位置偏下,上面的標題欄和部分控件會被頂上去。可是對於有滾動控件的布局來說。則不太一樣。我們看以下的效果圖。

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

技術分享圖片

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

最上面僅僅可以顯示到button,標題欄已經不能看到了。

技術分享圖片

而最以下也僅僅能滑動到8,以下的內容也不可以滑動了。

技術分享圖片

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

通過以上的實驗,我們能夠得出結論,假設我們不設置"adjust..."的屬性,對於沒有滾動控件的布局來說,採用的是adjustPan方式,而對於有滾動控件的布局,則是採用的adjustResize方式。

【Android開發經驗】android:windowSoftInputMode屬性具體解釋