1.我們在項目中經(jīng)常會遇到軟鍵盤遮擋頁面统屈,輸入框或者軟鍵盤自動彈出的場景寝并,在Android中Activity給我們提供了一個屬性<b>”windowSoftInputMode“</b>宪郊,專治輸入法對布局造成一系列的影響昼浦,我們只需要在<b>AndroidManifest.xml</b>文件中的activity中設置android:windowSoftInputMode屬性可以很好解決上面所說的問題吞加。
<activity android:name=".SecondActivity"
android:windowSoftInputMode="屬性值"/>
2.windowSoftInputMode屬性的取值:
該屬性一共有<b>9種</b>取值问麸,分別為:
- stateUnspecified
- stateUnchanged
- stateHidden
- stateAlwaysHidden
- stateVisible
- stateAlwaysVisible
- adjustUnspecified
- adjustResize
- adjustPan疗杉。
下面通過例子來演示每個屬性值的作用
第一部分:設置軟鍵盤的顯示與隱藏
1.stateUnspecified
中文意思是未指定狀態(tài)阵谚,Activity默認采用的就是這種交互方式蚕礼,系統(tǒng)會根據(jù)界面采取相應的軟鍵盤的顯示模式,當界面上只有文本和按鈕的時候梢什,軟鍵盤就不會自動彈出奠蹬,因為沒有輸入的必要;當界面上出現(xiàn)了獲取了焦點的輸入框的時候嗡午,又分為兩種情況:
- 1.第一種:有可輸入的控件囤躁,但是頁面不能滾動(不能自動彈出,需要點擊輸入框)
- 2.第二種:有可輸入的控件并且頁面可以滾動(能夠自動彈出)在上面的基礎上在布局中加上一個ScrollView荔睹,是頁面能夠滾動
因此狸演,我們可以得出結論,當設置屬性為<b>stateUnspecified</b>的時候僻他,系統(tǒng)是默認不彈出軟鍵盤的宵距,但是當有獲得焦點的輸入框的界面有滾動的需求的時候,會自動彈出軟鍵盤吨拗。至于為什么非要強調要獲取焦點的輸入框满哪,這是因為,如果不是輸入框獲取焦點劝篷,軟鍵盤也是不會自動彈出的哨鸭,讓界面不自動彈出軟鍵盤的其中一個解決方案,就是在xml文件中娇妓,設置一個非輸入框控件獲取焦點像鸡,從而阻止鍵盤彈出。
2.stateUnchanged
中文的意思就是狀態(tài)不改變的意思峡蟋,作用就是當前界面的軟鍵盤狀態(tài)坟桅,取決于上一個界面的軟鍵盤狀態(tài)华望。也就是說假如當前界面鍵盤是隱藏的蕊蝗,那么跳轉之后的界面,軟鍵盤也是隱藏的赖舟;如果當前界面是顯示的蓬戚,那么跳轉之后的界面,軟鍵盤也是顯示狀態(tài)宾抓。
<!-- 第一個Actiivty為默認的子漩,頁面能夠滾動-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 第二個Activity:軟件盤狀態(tài)跟隨上一個頁面-->
<activity android:name=".SecondActivity"
android:windowSoftInputMode="stateUnchanged"/>
設置為該屬性,軟鍵盤的狀態(tài)會跟著上一個頁面走石洗,即使當前的頁面沒有可輸入的控件幢泼。
3.stateHidden
顧名思義,如果我們設置了這個屬性讲衫,那么鍵盤狀態(tài)一定是隱藏的缕棵,不管上個界面什么狀態(tài),也不管當前界面有沒有輸入的需求,反正就是不顯示招驴。因此篙程,我們可以設置這個屬性,來控制軟鍵盤不自動的彈出
<!-- 第二個Activity:隱藏軟鍵盤-->
<activity android:name=".SecondActivity"
android:windowSoftInputMode="stateHidden"/>
4.stateAlwaysHidden
這個屬性也可以讓軟鍵盤隱藏别厘,目前測試跟stateHidden的效果一樣虱饿,還沒有測試出兩者的區(qū)別。
5.stateVisible
設置為這個屬性触趴,可以強制將軟鍵盤出來氮发,即使在界面上沒有輸入框的情況下。
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.yt.demo.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="沒有可輸入的控件"
android:gravity="center"/>
</LinearLayout>
6.stateAlwaysVisible
這個屬性也是可以將鍵盤強制顯示出來冗懦,與stateVisible屬性不同之處在于:當我們設置為stateVisible屬性折柠,如當我們點擊按鈕跳轉到下個界面的時候,軟鍵盤會因為輸入框失去焦點而隱藏起來批狐,當我們再次回到當前界面的時候扇售,鍵盤這個時候是隱藏的。但是如果我們設置為stateAlwaysVisible嚣艇,我們跳轉到下個界面承冰,再次回來的時候,軟鍵盤是會顯示出來的食零。
<activity android:name=".MainActivity"
android:windowSoftInputMode="stateAlwaysVisible">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" />
第二部分:設置軟鍵盤與顯示內(nèi)容間的關系
1.adjustUnspecified
該屬性是默認的設置模式困乒。在這中情況下,系統(tǒng)會根據(jù)界面選擇不同的模式贰谣。如果界面里面有可以滾動的控件娜搂,比如ScrowView,系統(tǒng)會減小可以滾動的界面的大小吱抚,從而保證即使軟鍵盤顯示出來了百宇,也能夠看到所有的內(nèi)容。如果布局里面沒有滾動的控件秘豹,那么軟鍵盤可能就會蓋住一些內(nèi)容
如果沒有滾動控件携御,當可輸入的控件在上面時,軟件盤會遮擋內(nèi)容既绕;當可輸入的控件在下面時啄刹,內(nèi)容被頂上去了,同時標題欄也被頂上去了
如果有滾動控件凄贩,當可輸入的控件在上面時誓军,系統(tǒng)會減小可以滾動的界面的大小,從而保證即使軟鍵盤顯示出來了同時內(nèi)容可以滾動顯示出來疲扎;當可輸入的控件在下面時昵时,內(nèi)容被頂上去了廓译,但是標題欄沒有被頂上去。
2.adjustResize
這個屬性表示Activity的主窗口總是會被調整大小债查,從而保證軟鍵盤顯示空間非区。它跟adjustUnspecified的區(qū)別就在于當頁面可滾動并且可輸入控件在下面的時候,內(nèi)容被頂上去了盹廷,但是標題欄沒有被頂上去征绸。
3.adjustPan
Activity的屏幕大小并不會調整來保證軟鍵盤的空間,而是采取了另外一種策略俄占,系統(tǒng)會通過布局的移動管怠,來保證用戶要進行輸入的輸入框肯定在用戶的視線范圍內(nèi),從而讓用戶可以看到自己輸入的內(nèi)容缸榄。對于沒有滾動控件的布局來說渤弛,這個其實就是默認的設置,如果我們選擇的位置偏下甚带,上面的標題欄和部分控件會被頂上去她肯。但是對于有滾動控件的布局來說,則不太一樣鹰贵,我們看下面的效果圖晴氨。
只要可輸入控件在上面,不管能否滾動碉输,軟件盤都會遮擋部分內(nèi)容的
只要可輸入控件在下面籽前,不管能否滾動,內(nèi)容和標題欄都會被頂上去的敷钾。
第三部分:關于使用
上面第一部分介紹了軟件盤的顯示與隱藏枝哄,第二部分介紹了軟件盤與內(nèi)容之間的顯示關系,一般我們在使用的時候都是結合二者使用的阻荒。
android:windowSoftInputMode="【A】|【B】"http://A:為顯示屬性 B:為關系屬性