Перехватите кнопку «Назад» при закрытии клавиатуры и отключите мигающий курсор

#android #kotlin #android-fragments

Вопрос:

У меня есть фрагмент с редактируемым текстом, используемый в качестве строки поиска. То, что я хочу сделать, когда я нажимаю кнопку «Назад», чтобы закрыть клавиатуру, которая открывается при нажатии на редактируемый текст, — это отключить мигающий курсор. По какой-то причине, когда я обрабатываю приведенный ниже код, курсор все еще остается видимым.

 editText.setOnKeyListener{ _, keyCode, event ->
                if(keyCode == KeyEvent.KEYCODE_BACK) {
                    editText.isCursorVisible = false
                    true
                } else {
                    false
                }
        }
 

Я пробовал разные методы, но ни один из них не дал мне желаемого результата. Я что-то упускаю или есть другой способ справиться с этим?

Ответ №1:

Отправьте фокус на другой компонент на странице. Это должно быть полезно Или убрать фокус с вашего редактируемого текста с помощью этого кода

edittext.clearFocus();

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

1. К сожалению, я попробовал этот метод и не работает, мигающий курсор все еще виден.

2. Вы можете добавить невидимый редактируемый текст с 0 высотой и шириной и направить фокус на него

Ответ №2:

Вы действительно пытаетесь очистить фокус при нажатии кнопки «Назад»? Из предоставленного кода видно, что вы пытаетесь скрыть его, когда «Назад» нажимается только на клавиатуре.

Да, но эта реализация не в порядке. Вы должны поймать событие фактической обратной печати, а не так, как вы делаете это здесь. Я думаю, что здесь происходит то, что при первом нажатии кнопки «Назад» клавиатура скрывается, и вы даже не получаете клавишу «Назад». Теперь, если вы снова нажмете кнопку «Назад», она фактически скроет курсор. Также предоставленный код отключает кнопку «Назад», она будет работать только в том случае, если клавиатура открыта, в противном случае она просто очистит фокус и больше ничего не сделает

Я думаю, что что-то подобное могло бы охватить ваше дело:

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(false) {
            override fun handleOnBackPressed() {
                editText.clearFocus()
            }
        })
    }
 

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

1. Я попытался подойти к этому по-другому с помощью clearFocus(), но все равно ничего. Из предоставленного кода я пытаюсь отключить курсор при нажатии кнопки «Назад».

2. Да, но эта реализация не в порядке. Вы должны поймать событие фактической обратной печати, а не так, как вы делаете это здесь. Я думаю, что здесь происходит то, что при первом нажатии кнопки «Назад» клавиатура скрывается, и вы даже не получаете клавишу «Назад». Теперь, если вы снова нажмете кнопку «Назад», она фактически скроет курсор. Также предоставленный код отключает кнопку «Назад», она будет работать только в том случае, если клавиатура открыта, в противном случае она просто очистит фокус и больше ничего не сделает

3. Хорошо, можете ли вы поделиться примером с наилучшим возможным подходом?