Android中的輸入法


提起輸入法我就想到了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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM