Мне не удается отменить нажатие кнопки "Назад" на Android.
Дело в том, что все работает отлично, кроме самого первого раза. Когда я загружаю приложение и нажимаю кнопку «Назад» в первый раз, оно приостанавливает работу приложения, чего я НЕ хочу. В остальном он работает так, как ожидалось.
Мой код:
private void setupDeviceButtons(){ // this is ran at the very beginning (onViewCreated())
// setting up a listener to close the menus when the back button is pressed
View view = getView();
Log.e(TAG, "This happens when I load the app" );
if (view != null) {
Log.e(TAG, "This also happens when I load the app");
view.setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.e(TAG, "But this doesn't happen when I press the back button for the first time.");
// we filter all actions that are not key down
if (event.getAction() != KeyEvent.ACTION_DOWN)
return true;
...
}
return false;
});
} else {
Log.e(TAG, "ERROR on setupDeviceButtons(): Unable to set back button behaviour. View is null.");
}
}
Есть предположения?
заранее спасибо
Это был мой первый подход. Это хорошая идея. Но лучше всего изолировать код.
Но это поможет вам сократить трудозатраты. Например, предположим, что вы установили onKeyListener для одного представления, а другое представление вашего макета в настоящее время находится в сфокусированном состоянии, в этом случае ваш код ключевого события может не работать.
И я думаю, что именно это и произошло, поскольку ответ Мараджа Хусейна работает очень хорошо. Я понимаю вашу точку зрения. Но я бы предпочел небольшое обходное решение, чем использовать спагетти-код в моей функции. Но это всего лишь вопрос мнения. Спасибо, что помогли мне.




Используйте приведенный ниже код, отлично работающий по фрагментам.
//on fragment back pressed
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction()== KeyEvent.ACTION_DOWN) {
// do your code on back pressed
return true;
}
return false;
}
});
Почему бы вам не переопределить
onKeyDownв своей деятельности вместоonKeyListenerв представлении?