1.我們在項目中經(jīng)常會遇到軟鍵盤遮擋頁面,輸入框或者軟鍵盤自動彈出的場景,在Android中Activity給我們提供了一個屬性<b>”windowSoftInputMode“</b>,專治輸入法對布局造成一系列的影響,我們只需要在<b>AndroidManifest.xml</b>文件中的activity中設(shè)置android:windowSoftInputMode屬性可以很好解決上面所說的問題。
<activity android:name=".SecondActivity"
android:windowSoftInputMode="屬性值"/>
2.windowSoftInputMode屬性的取值:
該屬性一共有<b>9種</b>取值,分別為:
- stateUnspecified
- stateUnchanged
- stateHidden
- stateAlwaysHidden
- stateVisible
- stateAlwaysVisible
- adjustUnspecified
- adjustResize
- adjustPan。
下面通過例子來演示每個屬性值的作用
第一部分:設(shè)置軟鍵盤的顯示與隱藏
1.stateUnspecified
中文意思是未指定狀態(tài),Activity默認采用的就是這種交互方式,系統(tǒng)會根據(jù)界面采取相應(yīng)的軟鍵盤的顯示模式,當(dāng)界面上只有文本和按鈕的時候,軟鍵盤就不會自動彈出,因為沒有輸入的必要;當(dāng)界面上出現(xiàn)了獲取了焦點的輸入框的時候,又分為兩種情況:
- 1.第一種:有可輸入的控件,但是頁面不能滾動(不能自動彈出,需要點擊輸入框)

- 2.第二種:有可輸入的控件并且頁面可以滾動(能夠自動彈出)在上面的基礎(chǔ)上在布局中加上一個ScrollView,是頁面能夠滾動

因此,我們可以得出結(jié)論,當(dāng)設(shè)置屬性為<b>stateUnspecified</b>的時候,系統(tǒng)是默認不彈出軟鍵盤的,但是當(dāng)有獲得焦點的輸入框的界面有滾動的需求的時候,會自動彈出軟鍵盤。至于為什么非要強調(diào)要獲取焦點的輸入框,這是因為,如果不是輸入框獲取焦點,軟鍵盤也是不會自動彈出的,讓界面不自動彈出軟鍵盤的其中一個解決方案,就是在xml文件中,設(shè)置一個非輸入框控件獲取焦點,從而阻止鍵盤彈出。
2.stateUnchanged
中文的意思就是狀態(tài)不改變的意思,作用就是當(dāng)前界面的軟鍵盤狀態(tài),取決于上一個界面的軟鍵盤狀態(tài)。也就是說假如當(dāng)前界面鍵盤是隱藏的,那么跳轉(zhuǎn)之后的界面,軟鍵盤也是隱藏的;如果當(dāng)前界面是顯示的,那么跳轉(zhuǎn)之后的界面,軟鍵盤也是顯示狀態(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"/>

設(shè)置為該屬性,軟鍵盤的狀態(tài)會跟著上一個頁面走,即使當(dāng)前的頁面沒有可輸入的控件。
3.stateHidden
顧名思義,如果我們設(shè)置了這個屬性,那么鍵盤狀態(tài)一定是隱藏的,不管上個界面什么狀態(tài),也不管當(dāng)前界面有沒有輸入的需求,反正就是不顯示。因此,我們可以設(shè)置這個屬性,來控制軟鍵盤不自動的彈出
<!-- 第二個Activity:隱藏軟鍵盤-->
<activity android:name=".SecondActivity"
android:windowSoftInputMode="stateHidden"/>

4.stateAlwaysHidden
這個屬性也可以讓軟鍵盤隱藏,目前測試跟stateHidden的效果一樣,還沒有測試出兩者的區(qū)別。
5.stateVisible
設(shè)置為這個屬性,可以強制將軟鍵盤出來,即使在界面上沒有輸入框的情況下。
<?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屬性不同之處在于:當(dāng)我們設(shè)置為stateVisible屬性,如當(dāng)我們點擊按鈕跳轉(zhuǎn)到下個界面的時候,軟鍵盤會因為輸入框失去焦點而隱藏起來,當(dāng)我們再次回到當(dāng)前界面的時候,鍵盤這個時候是隱藏的。但是如果我們設(shè)置為stateAlwaysVisible,我們跳轉(zhuǎn)到下個界面,再次回來的時候,軟鍵盤是會顯示出來的。
<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" />

第二部分:設(shè)置軟鍵盤與顯示內(nèi)容間的關(guān)系
1.adjustUnspecified
該屬性是默認的設(shè)置模式。在這中情況下,系統(tǒng)會根據(jù)界面選擇不同的模式。如果界面里面有可以滾動的控件,比如ScrowView,系統(tǒng)會減小可以滾動的界面的大小,從而保證即使軟鍵盤顯示出來了,也能夠看到所有的內(nèi)容。如果布局里面沒有滾動的控件,那么軟鍵盤可能就會蓋住一些內(nèi)容


如果沒有滾動控件,當(dāng)可輸入的控件在上面時,軟件盤會遮擋內(nèi)容;當(dāng)可輸入的控件在下面時,內(nèi)容被頂上去了,同時標(biāo)題欄也被頂上去了


如果有滾動控件,當(dāng)可輸入的控件在上面時,系統(tǒng)會減小可以滾動的界面的大小,從而保證即使軟鍵盤顯示出來了同時內(nèi)容可以滾動顯示出來;當(dāng)可輸入的控件在下面時,內(nèi)容被頂上去了,但是標(biāo)題欄沒有被頂上去。
2.adjustResize
這個屬性表示Activity的主窗口總是會被調(diào)整大小,從而保證軟鍵盤顯示空間。它跟adjustUnspecified的區(qū)別就在于當(dāng)頁面可滾動并且可輸入控件在下面的時候,內(nèi)容被頂上去了,但是標(biāo)題欄沒有被頂上去。

3.adjustPan
Activity的屏幕大小并不會調(diào)整來保證軟鍵盤的空間,而是采取了另外一種策略,系統(tǒng)會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視線范圍內(nèi),從而讓用戶可以看到自己輸入的內(nèi)容。對于沒有滾動控件的布局來說,這個其實就是默認的設(shè)置,如果我們選擇的位置偏下,上面的標(biāo)題欄和部分控件會被頂上去。但是對于有滾動控件的布局來說,則不太一樣,我們看下面的效果圖。


只要可輸入控件在上面,不管能否滾動,軟件盤都會遮擋部分內(nèi)容的


只要可輸入控件在下面,不管能否滾動,內(nèi)容和標(biāo)題欄都會被頂上去的。
第三部分:關(guān)于使用
上面第一部分介紹了軟件盤的顯示與隱藏,第二部分介紹了軟件盤與內(nèi)容之間的顯示關(guān)系,一般我們在使用的時候都是結(jié)合二者使用的。
android:windowSoftInputMode="【A】|【B】"http://A:為顯示屬性 B:為關(guān)系屬性