处理片段后退导航和底部导航视图所选项目



我实现了一个bottomNavigationView,每个选项都有其条目片段,有些选项在同一选项下具有更多导航。

不知何故像这样:

A->A1

B->B1

C->C1->C2

D->D1

E->E1->E2

其中 A、B、C、D 和 E 是底部导航视图的选项 (MenuItem),A1、B1、C1、D1、E1 是这些选项的条目片段

。所需的导航是应用程序的入口点和出口点将始终为选项 A(条目片段 A1)。因此,如果用户导航到另一个选项,只要该选项的条目片段中,则任何后退导航的行为都应该是转到选项 A。

我遇到的问题是底部导航视图始终作为要求存在,因此用户可以随时导航到任何选项。

例如,如果用户导航到选项 E,则在 E1 中执行导航到 E2 的操作,然后导航到选项 B,如果用户按后退按钮,应用应转到选项 A,因为位于条目片段 B1 中。 此外,如果用户使用底部导航视图导航到选项 A,然后按后退按钮,因为我们处于退出点,我们应该完成应用程序。

在 OnNavigationItemSelectedListener 中,我使用选项 A 以外的任何选项的beginTransaction.replace替换所选选项的条目片段的当前片段,我添加了addToBackStack(null)但仅此一项与所需的导航不匹配,因为如果用户按后退按钮,而不是导航到选项 A,它会导航到上一个选定的选项。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()
}

您应该只覆盖 BaseActivity 中的Activity.OnBackPressed()方法,您的每个活动都将继承该方法。 在该函数中,只需检查当前活动是否为A类型。如果是,请退出应用,否则,启动活动 A。

仅在添加片段 A1 时设置BACK_STACK_HOME_TAG状态。添加片段 B1、C1、D1 时无需弹出状态...
覆盖片段 A1 中的 onKeyDown(),使其退出应用程序:System.exit(0);
覆盖片段 B1、C1、D1 中的 onKeyDown(),将其设置回 A1,如下所示:

fragmentManager().popBackStack(BACK_STACK_HOME_TAG, 0);
对于 A2、B2、C2、D2...,只需弹出自身即可返回 A1、B1、C1、D1...
fragmentManager().popBackStack();

最新更新