Android 軟鍵盤彈出可能會遮擋住界面上的 EditText 或者是其他控件个榕,有時還會出現(xiàn)莫名其妙的問題凯旭,解決軟鍵盤問題概耻,先從 windowSoftInputMode 入手楣颠。windowSoftInputMode 常用的有 adjustPan,adjustResize咐蚯,adjustNothing 等童漩。本文也只研究這幾個屬性,其他可自行百度春锋。
為 Activity 指定 windowSoftInputMode
這個非常簡單矫膨,可以在 AndroidManifest.xml 也可以在 java 代碼中指定。
在 xml 中使用
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在 java 中使用
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);
}
}
接下來分析 windowSoftInputMode 常用的一些屬性期奔。
adjustPan
Activity 窗口(DecorView) 大小不變侧馅。當(dāng)獲取到焦點的 EditText 位于屏幕下方,軟鍵盤彈出會遮擋到 EditText 時呐萌,整個 DecorView 會往上移動馁痴,至于上移多少并不確定。
一般是上移至使 EditText 剛好不被軟鍵盤遮擋住為止肺孤。這個屬性用的比較多罗晕,常常配合 ScrollView 來使用。
adjustResize
顧名思義赠堵,這種模式會自動調(diào)整大小小渊。通過 hierarchy View 觀察,decorView 大小本身并不會改變茫叭,但是我們的內(nèi)容區(qū) contentView (id = android.R.content) 會相應(yīng)的縮小酬屉,為鍵盤的顯示挪出空間。contentView 的下面為空白區(qū)域揍愁,軟鍵盤就是覆蓋在這個區(qū)域呐萨。
注意:adjustResize 只是調(diào)整 contentView 的大小,所以還是有可能覆蓋掉 EditText莽囤。
adjustResize 最有用的是谬擦,這種模式可以輕松的獲取到軟鍵盤的高度,軟鍵盤彈出后 contentView 高度變化的差值即為軟鍵盤高度烁登。
另外:這種模式可能會有個問題怯屉,當(dāng)鍵盤消失時屏幕會出現(xiàn)一閃感覺有點難受。原因是鍵盤彈出時饵沧,鍵盤位置顯示的是 windowBackground ,如果 windowBackground 為黑色而 Activity 背景為白色赌躺,當(dāng)鍵盤消失時就會有閃動狼牺。解決辦法是在 Activity 主題上添加一個 android:windowBackground 屬性修改 windows 背景。
adjustNothing
這種模式 Activity窗口不會做任何調(diào)整礼患,contentView 大小也不會改變是钥。