天天看點

android軟鍵盤的用法總結

1.軟鍵盤的顯示原理

       軟鍵盤其實是一個Dialog。InputMethodService為我們的輸入法建立了一個Dialog,并且對某些參數進行了設定,使之能夠在底部或者全屏顯示。當我們點選輸入框時,系統會對目前的主視窗進行調整,以便留出相應的空間來顯示該Dialog在底部,或者全屏。

2.活動主視窗調整

       Android定義了一個屬性windowSoftInputMode, 用它可以讓程式控制活動主視窗調整的方式。我們可以在配置檔案AndroidManifet.xml中對Activity進行設定。這個屬性的設定将會影響兩件事情:

       1>軟鍵盤的狀态——隐藏或顯示。

       2>活動的主視窗調整——是否減少活動主視窗大小以便騰出空間放軟鍵盤或是否當活動視窗的部分被軟鍵盤覆寫時它的内容的目前焦點是可見的。

       故該屬性的設定必須是下面清單中的一個值,或一個“state…”值加一個“adjust…”值的組合。在任一組設定多個值,各個值之間用|分開。

"stateUnspecified":The state of the soft keyboard (whether it is hidden or visible) is not specified. The system will choose an appropriate state or rely on the setting in the theme. This is the default setting for the behavior of the soft keyboard. 軟鍵盤的狀态(隐藏或可見)沒有被指定。系統将選擇一個合适的狀态或依賴于主題的設定。這個是軟體盤行為的預設設定。

"stateUnchanged":The soft keyboard is kept in whatever state it was last in, whether visible or hidden, when the activity comes to the fore. 軟鍵盤被保持上次的狀态。

"stateHidden":The soft keyboard is hidden when the user chooses the activity — that is, when the user affirmatively navigates forward to the activity, rather than backs into it because of leaving another activity. 當使用者選擇該Activity時,軟鍵盤被隐藏。

"stateAlwaysHidden":The soft keyboard is always hidden when the activity's main window has input focus. 軟鍵盤總是被隐藏的。

"stateVisible":The soft keyboard is visible when that's normally appropriate (when the user is navigating forward to the activity's main window). 軟鍵盤是可見的。

"stateAlwaysVisible":The soft keyboard is made visible when the user chooses the activity — that is, when the user affirmatively navigates forward to the activity, rather than backs into it because of leaving another activity. 當使用者選擇這個Activity時,軟鍵盤是可見的。

"adjustUnspecified":It is unspecified whether the activity's main window resizes to make room for the soft keyboard, or whether the contents of the window pan to make the currentfocus visible on-screen. The system will automatically select one of these modes depending on whether the content of the window has any layout views that can scroll their contents. If there is such a view, the window will be resized, on the assumption that scrolling can make all of the window's contents visible within a smaller area. This is the default setting for the behavior of the main window. 它不被指定是否該Activity主視窗調整大小以便留出軟鍵盤的空間,或是否視窗上的内容得到螢幕上目前的焦點是可見的。系統将自動選擇這些模式中一種主要依賴于是否視窗的内容有任何布局視圖能夠滾動他們的内容。如果有這樣的一個視圖,這個視窗将調整大小,這樣的假設可以使滾動視窗的内容在一個較小的區域中可見的。這個是主視窗預設的行為設定。也就是說,系統自動決定是采用平移模式還是壓縮模式,決定因素在于内容是否可以滾動。

"adjustResize":(壓縮模式)The activity's main window is always resized to make room for the soft keyboard on screen. 當軟鍵盤彈出時,要對主視窗調整螢幕的大小以便留出軟鍵盤的空間。

"adjustPan":(平移模式:當輸入框不會被遮擋時,該模式沒有對布局進行調整,然而當輸入框将要被遮擋時,視窗就會進行平移。也就是說,該模式始終是保持輸入框為可見。)The activity's main window is not resized to make room for the soft keyboard. Rather, the contents of the window are automatically panned so that the current focus is never obscured by the keyboard and users can always see what they are typing. This is generally less desirable than resizing, because the user may need to close the soft keyboard to get at and interact with obscured parts of the window. 該Activity主視窗并不調整螢幕的大小以便留出軟鍵盤的空間。相反,目前視窗的内容将自動移動以便目前焦點從不被鍵盤覆寫和使用者能總是看到輸入内容的部分。這個通常是不期望比調整大小,因為使用者可能關閉軟鍵盤以便獲得與被覆寫内容的互動操作。。

3.偵聽軟鍵盤的顯示隐藏

       有時候,借助系統本身的機制來實作主視窗的調整并非我們想要的結果,我們可能希望在軟鍵盤顯示隐藏的時候,手動的對布局進行修改,以便使軟鍵盤彈出時更加美觀。這時就需要對軟鍵盤的顯示隐藏進行偵聽。

       我們可以借助軟鍵盤顯示和隐藏時,對主視窗進行了重新布局這個特性來進行偵聽。如果我們設定的模式為壓縮模式,那麼我們可以對布局的onSizeChanged函數進行跟蹤,如果為平移模式,那麼該函數可能不會被調用。

4.EditText預設不彈出軟體鍵盤

方法一:

在AndroidMainfest.xml中選擇哪個activity,設定windowSoftInputMode屬性為adjustUnspecified|stateHidden

例如:<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>

方法二:

讓EditText失去焦點,使用EditText的clearFocus方法

例如:EditText edit=(EditText)findViewById(R.id.edit);

           edit.clearFocus();

方法三:

強制隐藏Android輸入法視窗

例如:EditText edit=(EditText)findViewById(R.id.edit);  

           InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 

           imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

5.EditText始終不彈出軟體鍵盤

例:EditText edit=(EditText)findViewById(R.id.edit);

       edit.setInputType(InputType.TYPE_NULL);