Search code examples
javaandroidandroid-softkeyboardandroid-10.0

Closing keyboard programmatically not working on Android 10


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?


Solution

  • 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;
            }
        }
    }