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