KEYCODE_BACK не работает при первом нажатии

Мне не удается отменить нажатие кнопки "Назад" на 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.");
        }
    }

Есть предположения?

заранее спасибо

Почему бы вам не переопределить onKeyDown в своей деятельности вместо onKeyListener в представлении?

Md Sufi Khan 10.05.2018 15:56

Это был мой первый подход. Это хорошая идея. Но лучше всего изолировать код.

Luís Henriques 10.05.2018 16:03

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

Md Sufi Khan 10.05.2018 16:08

И я думаю, что именно это и произошло, поскольку ответ Мараджа Хусейна работает очень хорошо. Я понимаю вашу точку зрения. Но я бы предпочел небольшое обходное решение, чем использовать спагетти-код в моей функции. Но это всего лишь вопрос мнения. Спасибо, что помогли мне.

Luís Henriques 10.05.2018 16:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
980
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте приведенный ниже код, отлично работающий по фрагментам.

    //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;
        }
    });

Другие вопросы по теме