Dmytro Zarezenko
Dmytro Zarezenko

Reputation: 10686

Hide soft keyboard after dialog dismiss

I want to hide soft keyboard after AlertDialog dismiss, but it's still visible. Here is my code:

alert = new AlertDialog.Builder(MyActivity.this);
imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

alert.setOnDismissListener(new DialogInterface.OnDismissListener() {

    @Override
    public void onDismiss(DialogInterface dialog) {
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
});

Upvotes: 49

Views: 39308

Answers (8)

jvargas
jvargas

Reputation: 843

in case anyone looks for this in kotlin, it would be:

private fun hideDeviceKeyboard() {
    val imm = context!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
}

Upvotes: 0

Yusuf Yaşar
Yusuf Yaşar

Reputation: 326

protected void hideKeyboard() {
    final Activity activity = getActivity();
    final View view = activity != null ? activity.getCurrentFocus() : null;
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (view != null) {
                InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null)
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
        }
    }, 1);
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    hideKeyboard();
}

Upvotes: 2

Karthik Sankar
Karthik Sankar

Reputation: 101

This works! This will close the keyboard after dialog dismiss

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

Upvotes: 6

Rajeshwar
Rajeshwar

Reputation: 1501

In Manifest xml

android:windowSoftInputMode="stateAlwaysHidden"

It will automatically hide soft keyboard on Dismiss of Dialog

Upvotes: 125

Miika Pakarinen
Miika Pakarinen

Reputation: 261

I had a similar problem when closing an alert dialog. This seems to do the trick for me.

Inside your DialogFragment

public static void closeKB(final View view) 
{
    caller.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }, 1);
}

@Override
public void onDismiss(DialogInterface dialog)
{
    super.onDismiss(dialog);
            View view = getActivity().getCurrentFocus();
    if (view != null)
    {
        closeKB(view);
    }
}

Upvotes: 8

user3130847
user3130847

Reputation: 9

All these advices to use InputMethodManager are somewhat vague - where exactly to call it,
and they do not work at least for me.
Yes, keyboard disappears but then the app crashes!?
The main problem is that hiding of keyboard happens at the same time when dialog is disappearing.

To avoid it dialog.dismiss() should be called in view.postDelayed() after imm.hideSoftInputFromWindow() and in my case I set delay as 150.

Upvotes: 0

NordicShaw
NordicShaw

Reputation: 203

I met the same problem. Solved it by doing like this. It doesn't need any reference:

imm.hideSoftInputFromWindow(getWindow().getDecorView()
                .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Upvotes: 17

ScouseChris
ScouseChris

Reputation: 4397

I use this method:

IBinder token = searchTextEntry.getWindowToken();
( ( InputMethodManager ) getSystemService( Context.INPUT_METHOD_SERVICE ) ).hideSoftInputFromWindow( token, 0 );

Where searchTextEntry is the name of my EditText reference.

Upvotes: 7

Related Questions