Как определить, видна ли программная клавиатура на устройстве Android? - PullRequest
202 голосов
/ 20 января 2011

Есть ли в Android способ определить, видна ли на экране программная ("мягкая") клавиатура?

Ответы [ 24 ]

0 голосов
/ 26 июня 2015

Я сделал это следующим образом, но он будет отменен, только если ваша цель - закрыть / открыть клавиатуру.

пример закрытия: (проверка, закрыта ли клавиатура, если нет - закрытие)

imm.showSoftInput(etSearch, InputMethodManager.HIDE_IMPLICIT_ONLY, new ResultReceiver(null) {
                    @Override
                    protected void onReceiveResult(int resultCode, Bundle resultData) {
                        super.onReceiveResult(resultCode, resultData);
                        if (resultCode != InputMethodManager.RESULT_UNCHANGED_HIDDEN)
                            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                    }
                });
0 голосов
/ 10 апреля 2019

Как вы, наверное, знаете, Клавиатура Android Software будет видна только при возможном событии набора текста. Другими словами, клавиатура становится видимой только тогда, когда находится EditText. это означает, что вы можете узнать, видна клавиатура или нет, используя OnFocusChangeListener .

//Declare this Globally

public boolean isKeyBoardVisible = false;

//In OnCreate *[For Activity]*, OnCreateView *[For Fragment]*

text_send.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus)
            isKeyBoardVisible = true;
        else
            isKeyBoardVisible = false;
    }
});

Теперь вы можете использовать переменную isKeyBoardVisible в любом месте класса, чтобы узнать, открыта ли клавиатура или нет. Это хорошо сработало для меня.

Примечание: Этот процесс не работает, когда клавиатура открывается программно с помощью InputMethodManager , потому что это не вызывает OnFocusChangeListener.

0 голосов
/ 16 июня 2019

Я преобразовал ответ в kotlin, надеюсь, это поможет пользователям kotlin.

private fun checkKeyboardVisibility() {
    var isKeyboardShowing = false

    binding.coordinator.viewTreeObserver.addOnGlobalLayoutListener {
        val r = Rect()
        binding.coordinator.getWindowVisibleDisplayFrame(r)
        val screenHeight = binding.coordinator.rootView.height

        // r.bottom is the position above soft keypad or device button.
        // if keypad is shown, the r.bottom is smaller than that before.
        val keypadHeight = screenHeight - r.bottom


        if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
            // keyboard is opened
            if (!isKeyboardShowing) {
                isKeyboardShowing = true

            }
        } else {
            // keyboard is closed
            if (isKeyboardShowing) {
                isKeyboardShowing = false

            }
        }
    }
}
0 голосов
/ 25 января 2011

У меня была похожая проблема. Мне нужно было отреагировать на кнопку Enter на экране (которая спрятала клавиатуру). В этом случае вы можете подписаться на действие OnEditorAction текстового представления, с которым была открыта клавиатура - если у вас есть несколько редактируемых блоков, то подпишитесь на все из них.

В своей деятельности вы полностью контролируете клавиатуру, поэтому ни при каких условиях вы не столкнетесь с проблемой, открыта ли клавиатура или нет, если вы прослушиваете все события открытия и закрытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...