Не удалось поймать событие кнопки возврата Android

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
    if(keyCode == KeyEvent.KEYCODE_BACK){
        Log.d(TAG, "back key captured");
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Я также пробовал это:

@Override
public void onBackPressed(){
    Log.d(TAG, "in onBackPressed");
    finish();
}

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

Спасибо.


person coder    schedule 16.11.2011    source источник
comment
Начните с добавления журнала перед тестом, чтобы убедиться, что вы используете метод. Если нет, убедитесь, что ваш вид в данный момент сфокусирован. Если нет, он не получит события onKey.   -  person ol_v_er    schedule 17.11.2011
comment
В первом примере при нажатии кнопки «Назад» возникает поведение по умолчанию?   -  person Thomas Williams    schedule 17.11.2011


Ответы (6)


Другой способ — переопределить метод public void onBackPressed(). Это проще и проще сделать.

person Brian    schedule 16.11.2011
comment
Действительно? Это довольно странно, вы делаете это из обычного действия, и вообще ничего не появляется? Возможно, попробуйте заставить его показывать тост при нажатии кнопки «Назад», чтобы еще раз убедиться, что у вашего отладчика нет проблем. - person Brian; 17.11.2011

Чтобы получить событие клавиатуры, представление должно иметь фокус. Чтобы заставить это использовать:

view.setFocusableInTouchMode(True);
view.requestFocus();
person Mohamed_AbdAllah    schedule 16.11.2011

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

person qix    schedule 16.11.2011
comment
На самом деле я пытаюсь использовать клавишу «Назад», чтобы закрыть собственную пользовательскую клавиатуру. - person coder; 17.11.2011
comment
поздно, но для всех, кто наткнется на этот вопрос, stackoverflow.com/questions/3940127/ может быть очень полезной, если стандартный подход Activity#onBackPressed() не работает. - person qix; 14.02.2012

Это работает для меня

private long lastBackPressTime = 0;
    @Override
public void onBackPressed() {
    if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
        Toast.makeText(this, R.string.backButtonWarning, 4000).show();
        this.lastBackPressTime = System.currentTimeMillis();
    } else {
        super.onBackPressed();
    }
}

В последнее время я экспериментировал с ОГРОМНЫМ количеством проблем из-за плагина ADT, который не генерирует соответствующий файл ресурсов (R). Так что дважды проверьте, что вы очистили свой проект

person dinigo    schedule 16.11.2011

Моя ситуация может быть необычной, но у меня было точно такое же поведение, поэтому я решил поделиться с классом! Причина оказалась в том, что внутри моего события onResume() для действия я запускал другое действие. Это действие заканчивалось до того, как оно когда-либо отображало какой-либо пользовательский интерфейс, но это означало, что «onResume» для моего основного действия постоянно вызывалось всякий раз, когда завершалось вспомогательное действие, и все события кнопки «Назад», казалось, исчезали в вспомогательное действие.

person Chris Rae    schedule 29.01.2013

Вот как я реализовал обработку события нажатия клавиши «назад».

/**
   * onKeyDown method
   * 
   * Executes code depending on what keyCode is pressed.
   * 
   * @param int keyCode
   * @param KeyEvent
   *          event KeyEvent object
   * 
   * @return true if the code completes execution, false otherwise
   * 
   */
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {        
    switch (keyCode) {
    case KeyEvent.KEYCODE_BACK:
      Log.d(TAG, "back key captured");

      this.onBackPressed();

      //You could also use this.moveTaskToBack(true) to return to the Home screen

      return true;

    default:
      return super.onKeyDown(keyCode, event);
    }
  }// end onKeyDown
person Bryan    schedule 16.11.2011