В моем приложении с одним действием я реализовал функцию, при которой нажатие кнопки «Назад» в основном действии запускает последовательность отложенного выхода, отображая сообщение «До свидания» перед закрытием приложения. Эта функция работает должным образом. Однако я столкнулся с проблемой: при переходе от фрагмента обратно к основному действию при нажатии кнопки «Назад» вместо возврата к основному действию приложение закрывается.
Вот как я настроил жим на спине в основном упражнении:
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();
}
});
Похоже, проблема возникает из-за того, что механизм обработки кнопки «Назад» конфликтует с навигацией по фрагменту. Я не уверен, почему возникает эта проблема, тем более что ее не было до реализации обработки кнопки «Назад» в основном действии.




Измененный ответ еще раз (попробуйте это)
В основном действии вы можете сохранить флаг, указывающий, должно ли нажатие кнопки «Назад» запускать последовательность выхода или переход обратно в стек фрагментов:
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