標籤:
原文地址:http://android.xsoftlab.net/training/keyboard-input/visibility.html
當輸入的焦點進入或者離開文字框時,Android會適時的顯示或隱藏IME。系統還會決定UI及文字框如何出現在IME的上方。比如,當垂直方向上的可用空間非常緊張時,那麼文字框可能就會填充IME上方的整個地區。對於大多數的APP來說,這樣的預設行為是它們所需要的。
不過在另一些情況中,你可能需要直接控制IME的顯示方式,以及需要在IME可見的時候控制UI的排布方式。那麼這節課主要就是介紹如何?這些。
在Activity啟動的時候顯示IME
儘管在Activity啟動的時候Android將焦點給了第一個文字框,但是它是不會觸發IME彈出的。這樣的行為是符合正常的習慣的,因為進入文字框可能不會Activity啟動後的首要任務。不管怎麼說,如果進入文字框是Activity的首要任務的話(比如登入介面),那麼你可能希望預設情況下進入Activity後就會彈出IME。
為了在Activity啟動後可以顯示IME,需要在資訊清單檔中對應的Activity的元素中添加屬性android:windowSoftInputMode。如下:
<application ... > <activity android:windowSoftInputMode="stateVisible" ... > ... </activity> ...</application>
Note:如果使用者的裝置含有實體按鍵,那麼軟鍵盤是不會彈出的。
按需求彈出IME
如果在Activity的生命週期內有這麼一個方法:你希望確保在該方法調用後IME是可見的,那麼你可以使用InputMethodManager來將它彈出。
舉個例子,下面的方法持有了一個View對象,使用者會在這個View內部輸入焦點什麼,所以調用requestFocus()方法可以將焦點賦給它,然後showSoftInput()就會將IME開啟:
public void showSoftKeyboard(View view) { if (view.requestFocus()) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); }}
Note: 一旦IME被彈出,那麼最好不要使用程式碼後置它。系統會在使用者終止文字框中的任務後將它隱藏或者使用者通過系統隱藏了它(比如使用了返回按鈕)。
指明你的UI應該如何響應IME的彈出
當IME出現在螢幕上時,它會減少APP在螢幕上的使用空間。那麼系統會決定如何調整UI的部分地區,但是它可能不是最準確的。為了確保APP擁有最佳的使用者體驗,應該指明系統如何調整UI。
為了聲明Activity的首選方式,應當在項目的資訊清單檔中對應的Activity下添加android:windowSoftInputMode屬性,並使用其中一個含有”adjust”的值。
舉個例子,為了確保系統可將UI調整到可用性區域域,應當使用”adjustResize”:
<application ... > <activity android:windowSoftInputMode="adjustResize" ... > ... </activity> ...</application>
除了以上的方法,你還可以使用組合的的方式來聲明UI調整規則與IME的可見度規則:
<activity android:windowSoftInputMode="stateVisible|adjustResize" ... > ... </activity>
指明”adjustResize”是很重要的:如果UI中含有一些使用者可能需要迅速訪問的按鍵或者需要操作的文字框的話。舉個例子,如果你使用相對布局將一個按鈕放置到了螢幕的底部,那麼使用”adjustResize”調整布局可以使該按鈕出現在IME的頂部,這樣在輸入完成之後就可以直接點擊該按鈕。
Android官方開發文檔Training系列課程中文版:鍵盤輸入處理之控制IME的顯示方式