Android窗口軟鍵盤(pán)調(diào)整的關(guān)鍵:windowSoftInputMode屬性設(shè)置
windowSoftInputMode 是 Android 中的一個(gè)屬性,定義了當(dāng)屏幕上有焦點(diǎn)且需要顯示軟鍵盤(pán)(即屏幕鍵盤(pán))時(shí),活動(dòng)(Activity)窗口應(yīng)該如何調(diào)整。屬性位于 AndroidManifest.xml 文件中,針對(duì)每個(gè) <activity> 標(biāo)簽進(jìn)行設(shè)置。
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
windowSoftInputMode 有多個(gè)可能的值,可以分為兩類:state 前綴的值和 adjust 前綴的值。
- 「state 前綴的值」:
stateUnspecified:軟鍵盤(pán)的默認(rèn)狀態(tài)由系統(tǒng)決定。
stateUnchanged:軟鍵盤(pán)將保持上一次的狀態(tài),無(wú)論是可見(jiàn)還是隱藏。
stateHidden:當(dāng) Activity 被創(chuàng)建時(shí),軟鍵盤(pán)是隱藏的。
stateAlwaysHidden:軟鍵盤(pán)總是隱藏的,即使用戶選擇了一個(gè)需要輸入文本的字段。
stateVisible:當(dāng) Activity 被創(chuàng)建時(shí),軟鍵盤(pán)是可見(jiàn)的。
stateAlwaysVisible:軟鍵盤(pán)總是可見(jiàn)的。
- 「adjust 前綴的值」:
adjustUnspecified:默認(rèn)調(diào)整方式。系統(tǒng)的選擇取決于屏幕大小和窗口是否可調(diào)整大小。
adjustResize:當(dāng)軟鍵盤(pán)顯示時(shí),窗口會(huì)調(diào)整大小,以便為軟鍵盤(pán)騰出空間。這通常意味著窗口的內(nèi)容會(huì)向上移動(dòng),以便為鍵盤(pán)騰出空間。
adjustPan:窗口內(nèi)容不會(huì)調(diào)整大小,而是向上平移,以便當(dāng)前獲得焦點(diǎn)的字段不被鍵盤(pán)遮擋。
在AndroidManifest.xml設(shè)置:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
在代碼中設(shè)置:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
}
這些值可以通過(guò) "|" 符號(hào)分隔進(jìn)行組合,在上面的代碼中,stateHidden 和 adjustResize 被組合在一起使用。
windowSoftInputMode 常用的屬性有 adjustPan,adjustResize,adjustNothing
adjustPan
窗口內(nèi)容不會(huì)調(diào)整大小,而是向上平移,以便當(dāng)前獲得焦點(diǎn)的字段不被鍵盤(pán)遮擋。Activity窗口(DecorView)大小不變。當(dāng)獲取到焦點(diǎn)的EditText位于屏幕下方,軟鍵盤(pán)彈出會(huì)遮擋到EditText時(shí),整個(gè)DecorView會(huì)往上移動(dòng),至于上移多少并不確定。一般是上移至使EditText剛好不被軟鍵盤(pán)遮擋住為止。
圖片
adjustResize
當(dāng)軟鍵盤(pán)顯示時(shí),窗口會(huì)調(diào)整大小,以便為軟鍵盤(pán)騰出空間。通常意味著窗口的內(nèi)容會(huì)向上移動(dòng),以便為鍵盤(pán)騰出空間。DecorView大小不會(huì)改變,內(nèi)容區(qū)contentView(id = android.R.content)會(huì)相應(yīng)的縮小為鍵盤(pán)騰出空間。
圖片
注意:adjustResize只是調(diào)整contentView的大小,所以還是有可能覆蓋掉EditText。
adjustNothing
Activity窗口不會(huì)做任何調(diào)整,contentView大小也不會(huì)改變。