android-layout show keyboard - 關閉/隱藏Android軟鍵盤





15 Answers

您可以使用InputMethodManager強制Android隱藏虛擬鍵盤,調用hideSoftInputFromWindow ,傳入包含焦點視圖的窗口的標記。

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

這將強制鍵盤在所有情況下都被隱藏。 在某些情況下,您需要傳入InputMethodManager.HIDE_IMPLICIT_ONLY作為第二個參數,以確保在用戶未明確強制顯示鍵盤時(僅通過按住菜單)隱藏鍵盤。

注意:如果要在Kotlin中執行此操作,請使用: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

close soft input

我的佈局中有一個EditText和一個Button

在編輯字段中寫入並單擊Button ,我想隱藏虛擬鍵盤。 我假設這是一段簡單的代碼,但我在哪裡可以找到它的一個例子?




我還有一個隱藏鍵盤的解決方案:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

這裡在HIDE_IMPLICIT_ONLY的位置傳遞HIDE_IMPLICIT_ONLY ,在HIDE_IMPLICIT_ONLY的位置showFlag 0 。 它會強行關閉軟鍵盤。




請在onCreate()嘗試以下代碼

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);



protected void hideSoftKeyboard(EditText input) {
    input.setInputType(0);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}



到目前為止, Saurabh Pareek有最好的答案。

不過,不妨使用正確的旗幟。

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

實際使用的例子

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}



簡短的回答

OnClick偵聽onEditorAction中,使用IME_ACTION_DONE調用EditTextIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

深入研究

我覺得這種方法更好,更簡單,更符合Android的設計模式。 在上面的簡單示例中(通常在大多數常見情況下),您將擁有一個具有焦點的EditText ,它通常也是首先調用鍵盤的鍵盤(它肯定能夠調用它)許多常見情況)。 以同樣的方式, 應該是釋放鍵盤的那個,通常可以通過ImeAction來完成。 只要看看帶有android:imeOptions="actionDone"EditText如何表現,你想用同樣的方法實現相同的行為。

檢查這個相關的答案




我正在使用自定義鍵盤輸入​​十六進制數字,因此我無法顯示IMM鍵盤...

在v3.2.4_r1中添加了setSoftInputShownOnFocus(boolean show)以控制天氣或不顯示TextView獲得焦點時的鍵盤,但它仍然隱藏,因此必須使用反射:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

對於舊版本,我使用OnGlobalLayoutListener獲得了非常好的結果(但遠非完美),在我的根視圖中藉助OnGlobalLayoutListener添加,然後檢查鍵盤是否顯示如下:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

最後一個解決方案可以顯示鍵盤一瞬間,並與選擇手柄混淆。

當鍵盤進入全屏時,不會調用onGlobalLayout。 為避免這種情況,請使用TextView#setImeOptions(int)或TextView XML聲明:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

更新:剛剛找到哪些對話框用於永不顯示鍵盤並適用於所有版本:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);



我花了兩天多的時間來處理帖子中發布的所有解決方案,並發現它們缺乏這種或那種方式。 我的確切要求是有一個100%可靠性的按鈕顯示或隱藏屏幕鍵盤。 當鍵盤處於隱藏狀態時,無論用戶點擊什麼輸入字段,都不應重新出現。 當它處於可見狀態時,無論用戶點擊什麼按鈕,鍵盤都不會消失。 這需要在Android 2.2+上運行,直到最新的設備。

你可以在我的app clean RPN中看到這個的有效實現。

在許多不同的手機(包括froyo和薑餅設備)上測試了許多建議的答案後,很明顯Android應用程序可以可靠地:

  1. 暫時隱藏鍵盤。 當用戶聚焦新文本字段時,它將再次重新出現。
  2. 在活動開始時顯示鍵盤,並在活動上設置一個標誌,指示鍵盤應始終可見。 只有在活動初始化時才能設置此標誌。
  3. 將活動標記為從不顯示或允許使用鍵盤。 只有在活動初始化時才能設置此標誌。

對我來說,暫時隱藏鍵盤是不夠的。 在某些設備上,只要新的文本字段被聚焦,它就會重新出現。 由於我的應用程序在一個頁面上使用多個文本字段,因此聚焦新文本字段將導致隱藏鍵盤再次彈回。

不幸的是,列表中的第2項和第3項僅在啟動活動時才具有可靠性。活動變得可見後,您無法永久隱藏或顯示鍵盤。訣竅是當用戶按下鍵盤切換按鈕時實際重啟您的活動。在我的應用程序中,當用戶按下切換鍵盤按鈕時,運行以下代碼:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

這會導致當前活動將其狀態保存到Bundle中,然後啟動活動,通過布爾值來指示是否應顯示或隱藏鍵盤。

在onCreate方法中,運行以下代碼:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

如果應該顯示軟鍵盤,則告訴InputMethodManager顯示鍵盤,並指示窗口使軟輸入始終可見。如果應隱藏軟鍵盤,則設置WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM。

這種方法可以在我測試過的所有設備上可靠運行 - 從運行Android 2.2的4歲HTC手機到運行4.2.2的nexus 7。這種方法的唯一缺點是你需要小心處理後退按鈕。由於我的應用程序基本上只有一個屏幕(它是一個計算器),我可以覆蓋onBackPressed()並返回到設備主屏幕。




感謝這個SO答案,我推導出以下內容,在我的情況下,滾動瀏覽ViewPager的片段時效果很好...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}



如果要在單元或功能測試期間關閉軟鍵盤,可以通過單擊測試中的“後退按鈕”來執行此操作:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

我把“後退按鈕”放在引號中,因為上面沒有觸發有onBackPressed()問題的Activity。它只是關閉鍵盤。

確保在繼續之前暫停一段時間,因為關閉後退按鈕需要一點時間,因此後續點擊視圖等將在短暫停頓後暫停(1秒足夠長時間) )。




這對我來說非常適合所有奇怪的鍵盤行為

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}



用這個

this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);



我幾乎已經嘗試了所有這些答案,我有一些隨機問題,尤其是三星Galaxy s5。

我最終得到的是強制展示和隱藏,它完美地運作:

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}



簡單易用的方法,只需調用hideKeyboardFrom(YourActivity.this); 隱藏鍵盤

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}



我有這種情況,我的EditText位置也可以在一個AlertDialog,所以鍵盤應該關閉解僱。以下代碼似乎在任何地方都可以使用:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}





Related