Android 軟鍵盤之 windowSoftInputMode 分析
Android 軟鍵盤彈出可能會遮擋住介面上的 EditText 或者是其他控制元件,有時還會出現莫名其妙的問題,解決軟鍵盤問題,先從 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) 大小不變。當獲取到焦點的 EditText 位於螢幕下方,軟鍵盤彈出會遮擋到 EditText 時,整個 DecorView 會往上移動,至於上移多少並不確定。
一般是上移至使 EditText 剛好不被軟鍵盤遮擋住為止。這個屬性用的比較多,常常配合 ScrollView 來使用。
image.png
adjustResize
顧名思義,這種模式會自動調整大小。通過 hierarchy View 觀察,decorView 大小本身並不會改變,但是我們的內容區 contentView (id = android.R.content) 會相應的縮小,為鍵盤的顯示挪出空間。contentView 的下面為空白區域,軟鍵盤就是覆蓋在這個區域。
注意:adjustResize 只是調整 contentView 的大小,所以還是有可能覆蓋掉 EditText。
adjustResize 最有用的是,這種模式可以輕鬆的獲取到軟鍵盤的高度,軟鍵盤彈出後 contentView 高度變化的差值即為軟鍵盤高度。
另外:這種模式可能會有個問題,當鍵盤消失時螢幕會出現一閃感覺有點難受。原因是鍵盤彈出時,鍵盤位置顯示的是 windowBackground ,如果 windowBackground 為黑色而 Activity 背景為白色,當鍵盤消失時就會有閃動。解決辦法是在 Activity 主題上新增一個 android:windowBackground 屬性修改 windows 背景。
image.png
adjustNothing
這種模式 Activity視窗不會做任何調整,contentView 大小也不會改變。