Проблема с getOnBackPressedDispatcher при обработке стека фрагментов

В моем приложении с одним действием я реализовал функцию, при которой нажатие кнопки «Назад» в основном действии запускает последовательность отложенного выхода, отображая сообщение «До свидания» перед закрытием приложения. Эта функция работает должным образом. Однако я столкнулся с проблемой: при переходе от фрагмента обратно к основному действию при нажатии кнопки «Назад» вместо возврата к основному действию приложение закрывается.

Вот как я настроил жим на спине в основном упражнении:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            exitAppWithDelay();
        }
    });
}

private void exitAppWithDelay() {
        recyclerView.setVisibility(View.GONE);
        appBarLayout.setVisibility(View.GONE);
        goodbyText.setVisibility(View.VISIBLE);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                finish(); // Finish the MainActivity after starting the GoodbyeScreen
            }
        }, EXIT_DELAY);
    }

Кроме того, при переходе к фрагментам основного действия вот код:

private void openFragmentBasedOnPosition(int position) {
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    Fragment fragment = null;
    String fragmentTag = null;

    switch (position) {
          case 0:
                fragment = new make_everything_ok_btn();
                fragmentTag = "make_everything_ok_btn";
                break; // And then other cases 

    }

    if (fragment != null) {
        transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,android.R.anim.fade_in, android.R.anim.fade_out);
        transaction.replace(R.id.fragment_container, fragment, fragmentTag);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

И в конкретном фрагменте у меня есть прослушиватель нажатия кнопки, который перезапускает фрагмент:

continueBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        requireActivity().getSupportFragmentManager().popBackStack();
        FragmentTransaction transaction = requireActivity().getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,android.R.anim.fade_in, android.R.anim.fade_out);                
        transaction.replace(R.id.fragment_container, new make_everything_ok_btn());
        transaction.addToBackStack(null);
        transaction.commit();
    }
});

Похоже, проблема возникает из-за того, что механизм обработки кнопки «Назад» конфликтует с навигацией по фрагменту. Я не уверен, почему возникает эта проблема, тем более что ее не было до реализации обработки кнопки «Назад» в основном действии.

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

Ответы 1

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

Измененный ответ еще раз (попробуйте это)

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

getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                if (isFragmentBackStackEmpty()) {
                    exitAppWithDelay();
                } else {
                    // If there are fragments in the back stack, proceed with default back navigation
                    getSupportFragmentManager().popBackStack();
                }
            }
        });


private boolean isFragmentBackStackEmpty() {
        return getSupportFragmentManager().getBackStackEntryCount() == 0;
    }

onBackPressed устарел, не так ли?, stackoverflow.com/q/72634225/21441013

Indie Dev 08.05.2024 12:35

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

Muhammad Shah 08.05.2024 12:44

Я изменил свой ответ, пожалуйста, проверьте

Muhammad Shah 08.05.2024 12:53

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

Indie Dev 08.05.2024 16:39

Я снова изменил свой ответ, пожалуйста, проверьте

Muhammad Shah 09.05.2024 08:49

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