Закрытие клавиатуры программно не работает на Android 10

#java #android #android-softkeyboard #android-10.0

#java #Android #android-программная клавиатура #android-10.0

Вопрос:

Я протестировал его на своем реальном устройстве API 19 и эмуляторе API 23, и этот метод работает нормально:

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

Однако он не работает на моем реальном устройстве Pixel 4a (Android 10). Кто-нибудь знает, как программно закрыть клавиатуру на Android 10?

Ответ №1:

В зависимости от того, где вы находитесь, вы можете использовать один из следующих методов:

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

Комментарии:

1. Не работает на Android 10. Я использую фрагмент один.

Ответ №2:

Попробуйте приведенный ниже статический метод

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

}
  

Ответ №3:

Добавьте разрешение задачи в свой манифест.

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