我已经实现了一个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。
我遇到的问题是bottomNavigationView总是作为一个需求出现,所以用户可以在任何时候导航到任何选项。
例如,如果用户导航到选项E,那么在E1中执行一个操作,导航到E2,然后导航到选项B,如果用户按下back按钮,则应用程序应该转到选项A,因为它在条目片段B1中。此外,如果用户使用底部导航视图导航到选项A,然后按下后退按钮,因为我们在出口点,我们应该完成应用程序。
在OnNavigationItemSelectedListener中,我使用除选项A之外的任何选项的beginTransaction.replace
替换所选选项的条目片段的当前片段。我添加了addToBackStack(null)
,但这并不匹配所需的导航,因为如果用户按下后退按钮,例如导航到选项A,它将导航到前一个所选选项。在使用popBackStack(BACK_STACK_HOME_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
替换片段并替换添加addToBackStack(BACK_STACK_HOME_TAG)
之前,A也曾尝试弹出后台包,但不知何故,当选择第二个选项时,它显示的不是所选选项的条目片段,而是片段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()
}
发布于 2019-06-12 03:26:51
您只需覆盖每个活动都将继承的BaseActivity中的Activity.OnBackPressed()
方法即可。在该函数中,只需检查当前活动是否为A
类型。如果是,则退出应用程序,否则,启动活动A。
发布于 2019-06-12 12:28:08
仅在添加片段A1时设置BACK_STACK_HOME_TAG状态。添加分片B1、C1、D1时无需弹出状态...
覆盖fragment A1中的onKeyDown(),使其退出应用程序:
System.exit(0);
覆盖片段B1中的onKeyDown(),C1,D1...,将其设置回A1,如下所示:
fragmentManager().popBackStack(BACK_STACK_HOME_TAG, 0);
对于A2,B2,C2,D2...,只要弹出自己回到A1,B1,C1,D1...
fragmentManager().popBackStack();
https://stackoverflow.com/questions/56550194
复制相似问题