Не удалось поймать событие кнопки возврата 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)


arrow_upward
17
arrow_downward

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

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

arrow_upward
8
arrow_downward

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

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

arrow_upward
2
arrow_downward

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

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

arrow_upward
1
arrow_downward

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

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

arrow_upward
1
arrow_downward

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

person Chris Rae    schedule 29.01.2013

arrow_upward
-1
arrow_downward

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

/**
   * 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