Справка по переадресации кнопки Android - PullRequest
1 голос
/ 03 мая 2011

Я делаю приложение, игру и хочу, чтобы игрок мог использовать кнопку «назад» для прыжков (для устройств с одним касанием).Моя целевая платформа - 2.1 (уровень API 7).

Я пробовал и onKeyDown (), и onBackPressed (), но они вызываются только тогда, когда кнопка «Назад» отпущена, а не когда она нажата.

1) Это нормально?

2) Как я могу сделать так, чтобы он регистрировал нажатие при нажатии кнопки?

РЕДАКТИРОВАТЬ: Я также хотел бы, чтобыдобавьте, что он работает правильно с клавиатуры (onKeyDown вызывается при нажатии клавиши).

1 Ответ

1 голос
/ 03 мая 2011

Обновление: мне стало интересно об этом .Взгляните на исходный код android.view.View: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java

типичным примером будет обработка клавиши BACK для обновления пользовательского интерфейса приложения вместо того, чтобы IME мог его увидетьи закройте себя.

код:

/**
 * Handle a key event before it is processed by any input method
 * associated with the view hierarchy.  This can be used to intercept
 * key events in special situations before the IME consumes them; a
 * typical example would be handling the BACK key to update the application's
 * UI instead of allowing the IME to see it and close itself.
 *
 * @param keyCode The value in event.getKeyCode().
 * @param event Description of the key event.
 * @return If you handled the event, return true. If you want to allow the
 *         event to be handled by the next receiver, return false.
 */
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    return false;
}

Использование dispatchKeyEvent:

@Override
public boolean dispatchKeyEvent (KeyEvent event) {
    Log.d("**dispatchKeyEvent**", Integer.toString(event.getAction()));
    Log.d("**dispatchKeyEvent**", Integer.toString(event.getKeyCode()));
    if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
        Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
        return true;
    }
    return false;
}

Записываетдва события независимо даже для клавиши возврата.По какой-то причине единственным ключом, который не регистрировался, был KEYCODE_HOME.Фактически, если вы удерживаете нажатой кнопку «Назад», вы увидите несколько ACTION_DOWN (0) событий подряд (и гораздо больше, если вместо этого вы return false;).Протестировано в эмуляторе Eclair и в Samsung Captivate (пользовательское Froyo ROM).

...