表示 Androidソフトキーボードを閉じる/隠す



15 Answers

hideSoftInputFromWindowを呼び出して、 InputMethodManagerを使用してフォーカスを収めたウィンドウのトークンを渡して、Androidに仮想キーボードを非表示にすることができます。

// 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を2番目のパラメータとして渡して、ユーザが明示的に(メニューを押しながら)表示されていないときだけキーボードを隠すようにする場合もあります。

注意: Kotlinでこれを行う場合は、 context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager使用しcontext?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

android キーボード 非表示

レイアウトにEditTextButtonがあります。

編集フィールドに書き込んでButtonをクリックした後、仮想キーボードを非表示にしたい。 私はこれが単純なコードだと仮定しますが、どこでその例を見つけることができますか?




私はキーボードを隠すもう一つの解決策を得た:

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

ここでは、 showFlagの位置でshowFlagを渡し、 HIDE_IMPLICIT_ONLYの位置で0hiddenFlagます。 それは、ソフトキーボードを強制的に閉じます。




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を使用してEditTextIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

ドリルダウン

私は、この方法がAndroidのデザインパターンによって、よりシンプルで、より整っていると感じています。 上記の単純な例(通常はほとんどの一般的な例)では、 EditTextを持っている/ EditTextしているEditTextを持っていて、通常はキーボードを最初に呼び出すものでした(これは間違いなく多くの一般的なシナリオ)。 同じように、 それはキーボードをリリースするものなければなりません。通常、これはImeActionで行うことができます。 android:imeOptions="actionDone" EditTextがどのようにEditTextするか見てみましょう。あなたは同じ手段で同じ振る舞いをしたいと思っています。

この関連する回答を確認してください




私は16進数を入力するカスタムキーボードを使用しているので、私はIMMキーボードを表示することはできません...

v3.2.4_r1 setSoftInputShownOnFocus(boolean show) 、TextViewにフォーカスが当たったsetSoftInputShownOnFocus(boolean show)天気を制御するためにキーボードを表示しないようにsetSoftInputShownOnFocus(boolean show)が追加されましたが、まだ隠れているので反射を使用する必要があります:

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 )、ルートビューのViewTreeObserver使って追加し、キーボードが次のように表示されているかどうかを確認します。

@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);



スレッドに投稿されているすべてのソリューションを2日以上使っていますが、どちらかの方法でそれらが不足していることがわかりました。 私の正確な要件は、オンスクリーンキーボードを表示または非表示にする100%信頼性のボタンを持つことです。 キーボードが隠れた状態にあるときは、ユーザーがクリックした入力フィールドに関係なく、再表示しないでください。 それが可視状態にあるとき、ユーザがどのボタンをクリックしてもキーボードは消えてはならない。 これは、最新の端末までAndroid 2.2以上で動作する必要があります。

私のアプリのきれいなRPNでこれの実用的な実装を見ることができます。

さまざまな携帯電話(froyoやgingerbread devicesなど)で提案された回答の多くをテストした後、アンドロイドアプリは確実に信頼できることが明らかになりました。

  1. 一時的にキーボードを隠す。 ユーザーが新しいテキストフィールドをフォーカスすると、再び表示されます。
  2. アクティビティが開始されたときにキーボードを表示し、キーボードが常に表示されるべきであることを示すフラグをアクティビティに設定します。 このフラグは、アクティビティの初期化時にのみ設定できます。
  3. アクティビティをマークして、キーボードの使用を表示または許可しないようにします。 このフラグは、アクティビティの初期化時にのみ設定できます。

私にとって、キーボードを一時的に隠すだけでは不十分です。 一部のデバイスでは、新しいテキストフィールドがフォーカスされるとすぐに再表示されます。 私のアプリケーションは1ページに複数のテキストフィールドを使用するので、新しいテキストフィールドに焦点を当てると、隠れたキーボードが再びポップアップします。

残念なことに、リストの項目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が設定されます。

このアプローチは、私がテストしたすべてのデバイスで確実に動作します。アンドロイド2.2を搭載した4歳のHTC電話から4.2.2を実行しているネクサス7です。 この方法の唯一の欠点は、戻るボタンの操作に注意する必要があることです。 私のアプリは基本的に1つの画面(電卓)しか持たないので、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()が問題のアクティビティを引き起こさないので、 "戻るボタン"を引用符で囲みます。キーボードを閉じるだけです。

移動する前に一時停止することをお奨めします。なぜなら、戻るボタンを閉じるのに少し時間がかかりますから、短い一時停止(1秒が十分に長くなるまで)まではViewsなどへのクリックは登録されません)。




これは私のためにすべての奇妙なキーボードの動作に役立ちました

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);



私はこれらの答えをすべて試してみましたが、特にsamsung 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