Скрыть клавиатуру и перейти к новому фрагменту по нажатию кнопки - PullRequest
0 голосов
/ 28 октября 2019

В настоящее время я пытаюсь совместить навигацию и закрытие клавиатуры при нажатии кнопки. Прямо сейчас у меня есть кнопка, которая использует R.id.action.actionname для перехода к новому фрагменту. Это в настоящее время установлено в слушателе onclick. Если пользователь переходит к новому фрагменту, клавиатура остается открытой, чего не должно быть.

Я попытался использовать приведенный ниже код без успеха

 val inputManager =
            activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val currentFocusedView = this.activity!!.currentFocus
        binding.idLoginButton.setOnClickListener() {

            if (currentFocusedView != null) {
                inputManager.hideSoftInputFromWindow(
                    currentFocusedView.windowToken,
                    InputMethodManager.HIDE_NOT_ALWAYS
                )
            }
            Navigation.createNavigateOnClickListener(R.id.action_homeFragment_to_loginFragment)
        }

У меня также естьпопытался поставить

Navigation.createNavigateOnClickListener(R.id.action_homeFragment_to_loginFragment)

в скобках

  binding.idLoginButton.setOnClickListener()

, что тоже не сработало.

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Поместите этот код в класс своей деятельности: -

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
    if (currentFocus != null) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
    }
    return super.dispatchTouchEvent(ev)
}

И надеюсь, что это решит вашу проблему.

0 голосов
/ 28 октября 2019

Если нет сфокусированного представления (например, это может произойти, если вы только что изменили фрагменты), есть другие представления, которые предоставят полезный маркер окна.

Это альтернативы для приведенного выше кода if (view ==null) view = new View (активность);Они не относятся явно к вашей деятельности.

Внутри класса фрагмента:

view = getView (). GetRootView (). GetWindowToken ();Задан фрагмент фрагмента в качестве параметра:

view = фрагмент.getView (). GetRootView (). GetWindowToken ();Начиная с вашего содержимого:

view = findViewById (android.R.id.content) .getRootView (). GetWindowToken ();

А также добавьте эту строку в конец метода:

view.clearFocus ();

Для получения дополнительной информации: https://stackoverflow.com/a/17789187/9351811

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