如何让App启动于titleFragment,且返回键跳转至gameFragment?
解决导航返回跳转问题的两种方案
方案一:拦截返回键手动导航(推荐)
保持startDestination仍为titleFragment,在aboutFragment和rulesFragment中分别拦截返回键事件,手动导航至gameFragment并调整导航栈:
- 在
aboutFragment的onViewCreated方法中添加返回键拦截逻辑:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { val navController = findNavController() // 导航到gameFragment,同时移除栈中的titleFragment和当前的aboutFragment navController.navigate( R.id.gameFragment, // 替换为你的gameFragment的id null, NavOptions.Builder() .setPopUpTo(R.id.titleFragment, inclusive = true) .build() ) } }) }
- 在
rulesFragment中复制上述逻辑,确保跳转目标id为gameFragment即可。
栈行为说明
- 若希望从
gameFragment返回时直接退出App:使用上述代码,setPopUpTo(R.id.titleFragment, inclusive = true)会将栈中titleFragment及之前的所有页面移除,最终栈中仅保留gameFragment。 - 若希望从
gameFragment返回时回到titleFragment:修改NavOptions为setPopUpTo(R.id.aboutFragment, inclusive = true)(aboutFragment场景),此时栈结构变为[titleFragment, gameFragment],返回时会回到titleFragment。
方案二:跳转时预调整导航栈
如果希望从titleFragment跳转至about/rulesFragment时就调整栈结构,让返回键默认回到gameFragment,可在跳转时添加栈操作:
在titleFragment中跳转至aboutFragment的代码里,先导航到gameFragment再跳转至aboutFragment,并移除titleFragment的栈记录:
// 从titleFragment跳转到aboutFragment的逻辑 val navController = findNavController() navController.navigate( R.id.gameFragment, null, NavOptions.Builder() .setPopUpTo(R.id.titleFragment, inclusive = true) .build() ) navController.navigate(R.id.aboutFragment)
注意事项
- 此方案会产生两次导航动画,若需优化可关闭动画(在
NavOptions中添加setEnterAnim(0).setExitAnim(0))。 - 重启App后仍会从
titleFragment启动,符合需求。
内容的提问来源于stack exchange,提问作者HaveMercyOnMe
相关产品推荐
相关产品推荐

