Как обработать backpressed (нажатие клавиши — в предыдущей версии), чтобы отобразить диалоговое окно подтверждения выхода из приложения?

#android #dialog #back #android-softkeyboard

#Android #диалоговое окно #Назад #android-softkeyboard

Вопрос:

Я создал логику для отображения диалогового окна подтверждения, когда пользователь нажимает кнопку «Назад», переопределяя метод backPressed, но это подразумевает необычное поведение. Если отображается клавиатура с программным вводом, при событии обратной клавиши она должна быть скрыта, а другое событие обратной клавиши должно запускать диалоговое окно подтверждения. Есть способ добиться этого? Может быть, путем определения, включена ли клавиатура мягкого ввода, и обойти диалоговое окно подтверждения?

Вот пример кода, чтобы прояснить это:

 public boolean onKeyUp(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
              //here is the mystery 
              if (soft keyboard is visible)
              {
                    return super.onKeyUp(keyCode, event);
              } else
              {
                                //method which shows the close dialog and close the application
                    onBackPressed();
                    return true;
              }
    }
              return super.onKeyUp(keyCode, event);
 }
  

Ответ №1:

если отображается программная клавиатура, я не думаю, что Activity может получить событие возврата ключа. поведение по умолчанию — клавиша возврата, заставляющая программную клавиатуру исчезать.

Просмотр также может блокировать ключевое событие, простой способ — setOnKeyListener. убедитесь, что ваше представление можно сфокусировать, и когда оно получит событие возврата ключа, просто верните true .

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

1. Да, вы правы. Реальная проблема заключалась в том, что у меня были переопределены как onKeyDown, так и onKeyUp, и это привело к двойному обратному нажатию. Теперь у меня переопределен только onKeyDown, а программная клавиатура использует событие. Было обнаружено еще одно странное поведение, то есть, когда перехватывается новое событие возврата ключа, onBackPressed игнорируется. Я должен справиться с этим. Спасибо за хороший ответ.

Ответ №2:

Код для скрытия программной клавиатуры :

  InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
  

вы можете поместить этот код на backkeypressed независимо от того, отображается клавиатура или нет

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

1. Спасибо за ответ. Моя реальная проблема в том, что клавиатура использует мое обратное событие, а затем отображается диалоговое окно подтверждения закрытия (то же самое обратное событие). Чего я действительно хочу, так это создать логику, которая показывает диалоговое окно подтверждения только тогда, когда на экране нет помех (программная клавиатура, выпадающий список spinner и т. Д.).