如何动态修改BottomNavigationView内嵌导航图的startDestination
问题根源
你之前的popUpTo配置直接弹出了整个home子导航图,破坏了Navigation 2.4+版本和BottomNavigationView绑定的多回退栈结构:每个底部标签对应一个独立的子导航图,子导航图本身需要保留在全局回退栈中,才能保证多回退栈正常工作。
正确修改步骤
- 调整home子导航图的跳转配置
不要弹出整个home子图,仅弹出HostFragment本身即可,修改home.xml中的两个跳转action:
<fragment android:id="@+id/hostFragment" android:name="com.example.android.bottomnav.homescreen.HostFragment" android:label="Host"> <action android:id="@+id/action_hostFragment_to_homeFragment" app:destination="@id/homeFragment" app:popUpTo="@id/hostFragment" app:popUpToInclusive="true"/> <action android:id="@+id/action_hostFragment_to_lockedFragment" app:destination="@id/lockedFragment" app:popUpTo="@id/hostFragment" app:popUpToInclusive="true"/> </fragment>
该配置会在跳转到HomeFragment/LockedFragment后,把HostFragment从home子图的回退栈中移除,此时home子图的回退栈仅剩目标页面,按返回键时home子图回退栈为空,就会直接退出应用。
- 修正MainActivity的AppBarConfiguration配置
你当前配置的顶级目的地仅包含R.id.mainFragment,需要替换为所有底部标签对应的子导航图ID,才能让多回退栈逻辑正常生效:
appBarConfiguration = AppBarConfiguration( setOf(R.id.home, R.id.list, R.id.form) )
- 校验BottomNavigationView的menu配置
确保底部导航菜单的每个item的android:id和对应子导航图的ID完全一致(即分别为@+id/home、@+id/list、@+id/form),这是Navigation组件自动绑定多回退栈的必要条件。
原错误配置的原因说明
你之前将popUpTo设为@id/home且popUpToInclusive="true",相当于把整个home子导航图从全局回退栈中移除,Navigation组件无法识别home为顶级目的地,切换标签时就会把新的标签页直接加入全局回退栈,最终出现按返回键逐个退回所有打开过的标签页的问题。
内容的提问来源于stack exchange,提问作者Tommy Jackson
相关产品推荐
相关产品推荐

