提起輸入法我就想到了Edittext,輸入法可以自動根據inputType來改變鍵盤的布局,在支付錢包中還特別隱藏的系統自帶的輸入法,直接讓用戶用軟件自己的輸入法,提高了安全性。所以,我們應該對輸入法這個東西有些了解,讓輸入法為自己所用。
一、獲取輸入管理對象
final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
二、操作輸入法
1. 強制顯示輸入法
通過測試,我發現強制顯示輸入法必須要用一個editText來做,其實也挺正常的,輸入法本身就是給editText輸入用的,所以自然要定義一個editText。
布局文件中我用了一個editText和兩個button
在Java代碼中,我們要找到這個editText,然后進行如下操作:
inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
全部代碼:
final EditText editText = (EditText)findViewById(R.id.editText); final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); Button showBtn = (Button) findViewById(R.id.input_button); showBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } });
2. 強制隱藏輸入法
用的布局文件還是剛剛那個,隱藏輸入法就不需要editText了。直接在button的點擊事件中寫下面的代碼就行。
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
全部代碼:
Button hideBtn = (Button)findViewById(R.id.hide_button); hideBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO 自動生成的方法存根 inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0); } });
3. 根據輸入法狀態來顯示/隱藏輸入法
有時候我們需要根據輸入法的狀態來做處理:如果輸入法已經顯示,那么就隱藏它;如果輸入法現在沒顯示,那么就顯示它。
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
全部代碼:
btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } });
4. 不自動彈出鍵盤
帶有EditText控件的在第一次顯示的時候會自動獲得focus,並彈出鍵盤,如果不想彈出輸入法,可以在Activity的oncreat中寫上這行代碼
// 禁止自動彈出輸入框 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
// this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); // 用這個可以防止自動彈出那個輸入法的Fragment.
也可以在mainfest文件中把對應的activity設置
android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。
<activity Android:name=".Main" Android:label="@string/app_name" Android:windowSoftInputMode="adjustUnspecified|stateHidden" Android:configChanges="orientation|keyboardHidden"> <intent-filter> <action Android:name="android.intent.action.MAIN" /> <category Android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
三、輸入法常量
public static final int HIDE_IMPLICIT_ONLY
hideSoftInputFromWindow(IBinder, int)中的標志,表示如果用戶未顯式地顯示軟鍵盤窗口,則隱藏窗口。
public static final int HIDE_NOT_ALWAYS
hideSoftInputFromWindow(IBinder, int)中的標志,表示軟鍵盤窗口總是隱藏,除非開始時以SHOW_FORCED顯示。
public static final int RESULT_HIDDEN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標志:軟鍵盤窗口從顯示切換到隱藏時的狀態。
public static final int RESULT_SHOWN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標志:軟鍵盤窗口從隱藏切換到顯示時的狀態。
public static final int RESULT_UNCHANGED_HIDDEN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標志:軟鍵盤窗口不變保持隱藏時的狀態。
public static final int RESULT_UNCHANGED_SHOWN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標志:軟鍵盤窗口不變保持顯示時的狀態。
public static final int SHOW_FORCED
showSoftInput(View, int)標志,表示用戶強制打開輸入法(如長按菜單鍵),一直保持打開直至只有顯式關閉。
public static final int SHOW_IMPLICIT
showSoftInput(View, int)標志,表示隱式顯示輸入窗口,非用戶直接要求。窗口可能不顯示。
四、動態改變輸入法鍵盤布局
我們知道EditText可以設置輸入的類型,這樣就能直接控制輸入法的鍵盤布局了。但如果我們想要在代碼中動態改變輸入的類型呢?
//設置用戶名的輸入框是可以輸入數字和字母的 usernameEt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);
usernameEt是一個editText,通過代碼設置輸入類型的方法是setInputType,后面傳入不同的常量就可以設置不同的輸入類型了。這點是editText中的知識,反正和輸入法有關,所以就順便提一下。
五、輸入法和Activity視圖的關系
輸入法再怎么特殊,它也就是一個在phoneWindow中繪制的view,你可以把它當作一個dialog,因此它自然有它自己的位置。而它的位置又是由activity指定的,下面來分析下它的布局。
1. Activity初始時的布局
我在activity的上下各放了一個textview來表示activityview的頂端和末端。運行出來的效果如下:
2. android:windowSoftInputMode="stateUnspecified"
我們在activity定義時加上這句話就表明,輸入法按照默認的模式顯示,軟鍵盤的狀態(隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。
<activity android:name=".MainActivity" android:label="@string/app_name" android:windowSoftInputMode="stateUnspecified">
當我們點擊show input后,跳出輸入法
效果:
可以看到,輸入法直接蓋到了原來的activity上了,下面的bottom直接被蓋住了。如果想要看到被蓋住的文字,必須要給布局外層套一個scrollView才行。
3. android:windowSoftInputMode="stateVisible"
這個模式下,activity和輸入法是同時出現的,也就是說activity啟動后輸入法也會啟動,不用我們點擊show input。效果和上面一樣,輸入法蓋住了下面的文字。
4. android:windowSoftInputMode="stateAlwaysVisible"
和上面的一樣,但解釋是,用戶選擇這個activity時,鍵盤是可見的。我的理解是如果這個activity獲取了焦點,那么鍵盤會自動出現。感覺和上面的沒啥區別。
5. android:windowSoftInputMode="stateHidden"
在activity中有edittext時也不顯示輸入法,也就是說只有當你點擊了editText后輸入法才會出現。效果是蓋住下面的bottom文字。
6. android:windowSoftInputMode="stateAlwaysHidden"
這個和上面的一樣,也是不自動顯示輸入法。效果和也是蓋住下面的文字。
7. android:windowSoftInputMode="adjustResize"
壓縮模式。當輸入法出現時,activity重新調整界面的布局,讓原來的界面和輸入法處於同一個平面中。效果如下,可以明顯的看到bottom沒有被壓住。
8.android:windowSoftInputMode="adjustPan"
平移模式。當輸入框不會被遮擋時,該模式沒有對布局進行調整,然而當輸入框將要被遮擋時, 窗口就會進行平移。也就是說,該模式始終是保持輸入框為可見
后來
經過測試發現,現在設置editText的requestFocuse沒有用了,如果希望已進入界面就顯示輸入法,那么必須要在activity的配置文件中進行輸入法的指定,比如像下面這樣:
android:windowSoftInputMode="stateVisible|adjustPan"
如果在有輸入法顯示的界面中,你手動調用finish方法,你會發現輸入法是不會消失的。所以如果遇到這樣的界面,需要復寫finish()然后強制關閉輸入法。
參考自:
http://my.oschina.net/jbcao/blog/61035
http://www.cnblogs.com/weixing/p/3300908.html
http://blog.csdn.net/blueangle17/article/details/12753397