У меня есть контейнер Fragment, который получает текущий показанный фрагмент.При нажатии кнопки «Назад» я хочу удалить самый верхний фрагмент, но когда он первый, вместо этого я хочу переместить приложение в фоновом режиме.(В противном случае мой основной фрагмент тоже будет удален.)
Так что мой (Kotlin) код выглядит так:
override fun onBackPressed() {
...
when (supportFragmentManager.backStackEntryCount) {
1 -> {
moveTaskToBack(true)
}
else -> {
super.onBackPressed()
//supportFragmentManager.popBackStackImmediate()
}
}
Это прекрасно работает, за одним исключением.Когда я запускаю приложение и показываю второй фрагмент, я нажимаю кнопку «Назад» дважды (быстро).Таким образом, верхний фрагмент начинает удаляться, но сразу после этого запускается второе обратное нажатие (при этом верхний фрагмент не удаляется полностью).Приложение переходит в фоновый режим (как и предполагалось), но когда я снова выводю приложение на передний план, верхний фрагмент все еще там (иногда уже частично удален), но он больше не реагирует.Если я заменю другой фрагмент в моем контейнере, он появится позади застрявшего фрагмента.Я также попытался использовать supportFragmentManager.popBackStackImmediate (), но это также не сработало.
Поэтому у меня есть два вопроса:
какМогу ли я продолжить очистку позже (когда приложение снова станет видимым)
или, если это не решение, как я могу проверить, продолжается ли еще транзакция Fragment в FragementManager (доперевод приложения в фоновый режим нажатием второй кнопки назад)
---- Редактировать 1 ----
Я заметил, что это происходит только при установке анимации транзакциипри замене фрагментов.Поэтому, если я удаляю эту строку в момент добавления фрагментов (а не при повторном нажатии), это выглядит так:
ft.setCustomAnimations(R.anim.enter_from_bottom, R.anim.exit_to_top,
R.anim.enter_from_top, R.anim.exit_to_bottom)
---- Редактировать 2 ----
При использованииэтот код здесь также работает (только с той разницей, что он также удаляет первый (нижний) фрагмент. Но очевидно, что нативный метод Android, кажется, позволяет избежать этой проблемы.
super.onBackPressed() // Remove bottom fragement
super.onBackPressed() // No more fragments -> move App into background
---- Этокак «создаются» фрагменты ----
val ft = supportFragmentManager.beginTransaction()
ft.setCustomAnimations(R.anim.enter_from_bottom, R.anim.exit_to_top,
R.anim.enter_from_top, R.anim.exit_to_bottom)
ft.replace(R.id.fragmentContainer, fragment, fragment::class.java.simpleName)
.addToBackStack(fragment::class.java.simpleName)
.commitAllowingStateLoss()
Вот скриншот того, как выглядят перекрывающиеся фрагменты:
![Screenshot of the overlapping Fragments](https://i.stack.imgur.com/Zk1XX.png)