一、軟鍵盤屬性
1. 屬性介紹
軟鍵盤的交互屬性通過android:windowSoftInputMode
設(shè)置疾棵,該屬性的設(shè)置主要包含兩個(gè)方面打毛。
第1:在當(dāng)前Activity獲取焦點(diǎn)時(shí)軟鍵盤是隱藏還是可見。屬性如下:
屬性 | 說明 |
---|---|
stateAlwaysHidden | 一直隱藏軟鍵盤 |
stateAlwaysVisible | 打開Activity即顯示軟鍵盤 |
stateHidden | 默認(rèn)隱藏趋急,EditText獲取焦點(diǎn)時(shí)顯示 |
stateVisible | 默認(rèn)顯示 |
stateUnchanged | |
stateUnspecified |
第2:是否根據(jù)軟鍵盤的顯示調(diào)整主窗口的尺寸或平移主窗口顶伞。
屬性 | 說明 |
---|---|
adjustNothing | 不調(diào)整主窗口饵撑,直接覆蓋 |
adjustPan | 如果焦點(diǎn)位置距離屏幕底部距離小于軟鍵盤高度,則把整個(gè)布局頂上去到焦點(diǎn)位置唆貌,不壓縮多余空間滑潘,否則同adjustNothing |
adjustResize | 重新分配多余空間,保證輸入內(nèi)容不會(huì)被輸入法覆蓋锨咙,值得注意的是:全屏狀態(tài)下语卤,adjustResize屬性會(huì)被忽略 |
adjustUnspecified | 由系統(tǒng)決定(默認(rèn)配置) |
2. 屬性應(yīng)用示例
下面來看在各個(gè)屬性下軟鍵盤彈出的表現(xiàn),測(cè)試時(shí)主要集中在第2類屬性,第1類屬性均使用stateHidden粹舵,也就是剛進(jìn)入界面時(shí)軟鍵盤默認(rèn)隱藏钮孵,當(dāng)EditText獲得焦點(diǎn)時(shí)彈出軟鍵盤。
測(cè)試所使用的頁(yè)面如下眼滤,其根布局是一個(gè)<LinearLayout>巴席。
1. adjustNothing
可以發(fā)現(xiàn)軟鍵盤彈出之后直接覆蓋在了原布局之上,如果EditText上方的布局高度較大的話诅需,軟鍵盤就會(huì)將EditText覆蓋住漾唉,導(dǎo)致用戶無法看到輸入框里的內(nèi)容。
2. adjustPan
在測(cè)試界面下堰塌,EditText到底部的距離小于軟鍵盤的高度赵刑,當(dāng)軟鍵盤彈出時(shí),整體的布局被頂起來以便顯示獲取焦點(diǎn)的EditText蔫仙。此時(shí)上方的背景圖會(huì)出現(xiàn)顯示不全的情況料睛。
3. adjustResize
在測(cè)試界面下,adjustResize和adjustNothing的效果是一樣的摇邦。
再看下adjustResize的說明,該屬性下會(huì)重新分配多余空間屎勘,來顯示獲得焦點(diǎn)的EditText施籍。而這里使用的測(cè)試界面根布局是線性布局,視圖之間的間隔使用margin特定的值概漱,不存在多余空間供分配丑慎。
現(xiàn)在嘗試將界面的根布局改為<ScrollView>。彈出軟鍵盤后的效果如下瓤摧。點(diǎn)擊EditText后竿裂,ScrollView會(huì)滾動(dòng)調(diào)整當(dāng)前顯示的區(qū)域,使獲得焦點(diǎn)的EditText正常顯示照弥,這時(shí)又和adjustPan相似腻异。
二、登錄界面軟鍵盤解決方案
來看這樣一種場(chǎng)景:有個(gè)登錄界面这揣,該界面頂部有圖或者有背景圖片悔常。但是EditText位于界面偏下方,如果將軟鍵盤覆蓋在上面给赞,那么EditText獲取焦點(diǎn)時(shí)是不可見的机打。該界面如下所示。
下面來為該界面適配軟鍵盤片迅,首先將鍵盤的屬性設(shè)置為adjustPan残邀,效果如下。此時(shí)背景圖已經(jīng)頂出屏幕邊緣,導(dǎo)致背景圖顯示不完整芥挣。
將鍵盤屬性改為adjustResize時(shí)效果如下膳汪,由于不存在多余的空間可供分配,效果和adjustNothing相同九秀,軟鍵盤直接覆蓋在了原布局上遗嗽。
那么怎么樣才能同時(shí)使背景圖片和EditText顯示完整呢?
我們平時(shí)隔開布局一般使用margin屬性鼓蜒,這時(shí)View之間的間距都是固定的痹换,即使設(shè)置adjustResize屬性,也不存在多余的空間可供分配都弹。而如果使用weight來表示間隔娇豫,那么在軟鍵盤彈出之后,整體的布局高度縮減畅厢,weight的空間又會(huì)被重新分配冯痢。
現(xiàn)將Activity布局文件修改如下,根布局使用<ScrollView>并設(shè)置android:fillViewport="true"
框杜,這樣其內(nèi)部的控件就會(huì)實(shí)現(xiàn)match_parent
的效果浦楣。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
......
android:orientation="vertical"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
....../>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登錄之后即可進(jìn)行操作"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="login"/>
</LinearLayout>
</ScrollView>
該布局下的界面如下所示。
彈出軟鍵盤后的效果如下所示咪辱,由于軟鍵盤占據(jù)了一定的高度振劳,整體界面的高度減小,可供weight所分配的空間就減小了油狂,這就是adjustResize的作用历恐。