Я реализовал bottomNavigationView, у каждого параметра есть свой фрагмент ввода, а у некоторых есть больше навигации по этой же опции.
Как-то так:
A-> A1
B-> B1
С-> С1> С2
D-> D1
E-> E1-> E2
Где A, B, C, D & E - параметры (MenuItem) для нижнего навигационного представления, а A1, B1, C1, D1, E1 - фрагменты ввода для этих параметров соответственно
Требуемая навигация заключается в том, что точкой входа и выхода приложения всегда будет опция А (фрагмент записи А1). Поэтому, если пользователь переходит к другому параметру, если он находится во фрагменте записи для этого параметра, поведение для любой обратной навигации должно заключаться в переходе к параметру A.
Проблема, с которой я столкнулся, заключается в том, что bottomNavigationView всегда присутствует в качестве требования, чтобы пользователь мог в любое время перейти к любой опции.
Например, если пользователь переходит к опции E, тогда в E1 выполняется действие, которое переходит к E2 a, а затем переходит к опции B, если пользователь нажимает кнопку «Назад», приложение должно перейти к опции A, потому что находится во фрагменте записи B1.
Кроме того, если пользователь переходит к варианту А с использованием нижнего навигационного окна и затем нажимает кнопку «Назад», так как мы находимся в точке выхода, мы должны завершить приложение.
В OnNavigationItemSelectedListener я заменяю текущий фрагмент для фрагмента записи для выбранной опции, используя beginTransaction.replace
для любых опций, кроме опции AI, добавьте addToBackStack(null)
, но это само по себе не соответствует требуемой навигации, так как если пользователь нажимает Кнопка «Назад», которая используется для перехода к варианту А, позволяет перейти к предыдущему выбранному параметру. A также пытался вытолкнуть задний пакет до замены фрагмента с помощью popBackStack(BACK_STACK_HOME_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
и замены, добавив addToBackStack(BACK_STACK_HOME_TAG)
, но каким-то образом при выборе второго параметра вместо показа фрагмента записи для выбранного параметра отображается фрагмент A1
.
navBar.setOnNavigationItemReselectedListener {
when(it.itemId) {
R.id.optionA -> {
// Removes all entries in the backstack if any
if (supportFragmentManager.backStackEntryCount > 0) {
supportFragmentManager.popBackStack(
null,FragmentManager.POP_BACK_STACK_INCLUSIVE
)
return@setOnNavigationItemSelectedListener true
}
// Replaces/add the entry fragment
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentHost, FragmentA1())
.commit()
return@setOnNavigationItemSelectedListener true
}
R.id.optionB -> {
// Removes all entries in the backstack up to BACK_STACK_HOME_TAG
supportFragmentManager.popBackStack(
BACK_STACK_HOME_TAG,
FragmentManager.POP_BACK_STACK_INCLUSIVE
)
// Replace the fragment with the entry FragmentB1
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentHost, FragmentB1())
.addToBackStack(BACK_STACK_HOME_TAG)
.commit()
return@setOnNavigationItemSelectedListener true
}
R.id.optionC -> {
// Removes all entries in the backstack up to BACK_STACK_HOME_TAG
supportFragmentManager.popBackStack(
BACK_STACK_HOME_TAG,
FragmentManager.POP_BACK_STACK_INCLUSIVE
)
// Replace the fragment with the entry FragmentC1
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentHost, FragmentC1())
.addToBackStack(BACK_STACK_HOME_TAG)
.commit()
return@setOnNavigationItemSelectedListener true
}
...
return@setOnNavigationItemSelectedListener false
}
}
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
supportFragmentManager.popBackStack()
return
}
super.onBackPressed()
}