Closing keyboard programmatically not working on Android 10

Viewed 586

I've tested it on my API 19 real device and API 23 emulator and this method works fine:

if(activity != null){
            View view = activity.getCurrentFocus();
            if (view != null){
                InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                if(inputManager != null){
                    inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            }
        }

However, it's not working on my Pixel 4a (android 10) real device. Does anyone know how to close the keyboard programmatically on android 10?

3 Answers

Based on where you are, you can use one of the below methods:

boolean hideSuccess = KeyboardUtils.hideKeyboard(activity);

// or
boolean hideSuccess = KeyboardUtils.hideKeyboard(fragment);

// or
boolean hideSuccess = KeyboardUtils.hideKeyboard(editText); // It's recommended

KeyboardUtils.java

import android.app.Activity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

import androidx.fragment.app.Fragment;

/**
 * @author aminography
 */
public class KeyboardUtils {

    public static boolean hideKeyboard(Activity activity) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm != null) {
            View focus = activity.getCurrentFocus();
            if (focus == null) focus = new View(activity);
            return imm.hideSoftInputFromWindow(focus.getWindowToken(), 0);
        } else {
            return false;
        }
    }

    public static boolean hideKeyboard(Fragment fragment) {
        InputMethodManager imm = (InputMethodManager) fragment.requireContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm != null) {
            View focus = fragment.requireActivity().getCurrentFocus();
            if (focus == null) focus = new View(fragment.requireContext());
            return imm.hideSoftInputFromWindow(focus.getWindowToken(), 0);
        } else {
            return false;
        }
    }

    public static boolean hideKeyboard(EditText editText) {
        InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm != null) {
            return imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        } else {
            return false;
        }
    }
}

Try the below static method

public static void hideSoftKeyboard(Activity activity) {

    InputMethodManager inputMethodManager =
            (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);

    View currentFocus = activity.getCurrentFocus();

    if (inputMethodManager != null) {
        IBinder windowToken = activity.getWindow().getDecorView().getRootView().getWindowToken();
        inputMethodManager.hideSoftInputFromWindow(windowToken, 0);
        inputMethodManager.hideSoftInputFromWindow(windowToken, InputMethodManager.HIDE_NOT_ALWAYS);

        if (currentFocus != null) {
            inputMethodManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
        }
    }

}

Add the task permission on your manifest.

<uses-permission android:name="android.permission.GET_TASKS"/>
Related