解決虛擬鍵盤把底部導(dǎo)航欄頂起問題
在配置文件中找到導(dǎo)航欄所在的activity節(jié)點
設(shè)置:android:windowSoftInputMode="adjustPan"就行了
原理分析:
一、軟鍵盤顯示的原理
軟件盤的本質(zhì)是什么?軟鍵盤其實是一個Dialog!
InputMethodService為我們的輸入法創(chuàng)建了一個Dialog,并且將該Dialog的Window的某些參數(shù)(如Gravity)進行了設(shè)置,使之能夠在底部或者全屏顯示。當(dāng)我們點擊輸入框時,系統(tǒng)對活動主窗口進行調(diào)整,從而為輸入法騰出相應(yīng)的空間,然后將該Dialog顯示在底部,或者全屏顯示。
二、活動主窗口調(diào)整
android定義了一個屬性,名字為windowSoftInputMode, 用它可以讓程序可以控制活動主窗口調(diào)整的方式。我們可以在AndroidManifet.xml中對Activity進行設(shè)置。如:android:windowSoftInputMode="stateUnchanged|adjustPan"
該屬性可選的值有兩部分,一部分為軟鍵盤的狀態(tài)控制,另一部分是活動主窗口的調(diào)整。前一部分本文不做討論,請讀者自行查閱android文檔。
模式一,壓縮模式
windowSoftInputMode的值如果設(shè)置為adjustResize:
那么該Activity主窗口總是被調(diào)整大小以便留出軟鍵盤的空間。
底部導(dǎo)航欄也會被頂起
模式二,平移模式
windowSoftInputMode的值如果設(shè)置為adjustPan,
那么該Activity主窗口并不調(diào)整屏幕的大小以便留出軟鍵盤的空間。相反,當(dāng)前窗口的內(nèi)容將自動移動以便當(dāng)前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分。這個通常是不期望比調(diào)整大小
底部導(dǎo)航欄不會被頂起事實上,當(dāng)輸入框不會被遮擋時,該模式?jīng)]有對布局進行調(diào)整,然而當(dāng)輸入框?qū)⒁徽趽鯐r,窗口就會進行平移。也就是說,該模式始終是保持輸入框為可見。如下圖,整個窗口,包括標(biāo)題欄均被上移,以保證文本框可見。
模式三 自動模式
當(dāng)屬性windowSoftInputMode被設(shè)置為adjustUspecified時,它不被指定是否該Activity主窗口調(diào)整大小以便留出軟鍵盤的空間,或是否窗口上的內(nèi)容得到屏幕上當(dāng)前的焦點是可見的。系統(tǒng)將自動選擇這些模式中一種主要依賴于是否窗口的內(nèi)容有任何布局視圖能夠滾動他們的內(nèi)容。如果有這樣的一個視圖,這個窗口將調(diào)整大小,這樣的假設(shè)可以使?jié)L動窗口的內(nèi)容在一個較小的區(qū)域中可見的。這個是主窗口默認(rèn)的行為設(shè)置。
也就是說,系統(tǒng)自動決定是采用平移模式還是壓縮模式,決定因素在于內(nèi)容是否可以滾動。
總結(jié)、
windowSoftInputMode 屬性解釋:
活動的主窗口如何與包含屏幕上的軟鍵盤窗口交互。這個屬性的設(shè)置將會影響兩件事情:
- 軟鍵盤的狀態(tài)——是否它是隱藏或顯示——當(dāng)活動(Activity)成為用戶關(guān)注的焦點。
- 活動的主窗口調(diào)整——是否減少活動主窗口大小以便騰出空間放軟鍵盤或是否當(dāng)活動窗口的部分被軟鍵盤覆蓋時它的內(nèi)容的當(dāng)前焦點是可見的。
在這設(shè)置的值(除"stateUnspecified"和"adjustUnspecified"以外)將覆蓋在主題中設(shè)置的值
它的設(shè)置必須是下面列表中的一個值,或一個”state…”值加一個”adjust…”值的組合。
各值的含義:
【A】stateUnspecified:軟鍵盤的狀態(tài)并沒有指定,系統(tǒng)將選擇一個合適的狀態(tài)或依賴于主題的設(shè)置
【B】stateUnchanged:當(dāng)這個activity出現(xiàn)時,軟鍵盤將一直保持在上一個activity里的狀態(tài),無論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態(tài)
【G】adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當(dāng)前窗口的內(nèi)容將自動移動以便當(dāng)前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分