使用Jetpack Navigation搭配FragmentContainerView时如何避免Fragment重建?
解决方案
你提到的多返回栈状态保存能力本质是Navigation 2.4.0+ 版本的NavController原生支持的特性,和承载NavHostFragment的FragmentContainerView没有关系,不需要对FragmentContainerView做额外改造即可实现,具体操作方案如下:
- 第一步:确认依赖版本
确保项目中引入的androidx.navigation:navigation-fragment-ktx、androidx.navigation:navigation-ui-ktx等相关依赖版本均≥2.4.0稳定版,底层逻辑已经默认支持状态保存能力。 - 第二步:手动导航时配置正确的NavOptions
如果你是通过navigate()方法手动触发导航,只需要在构建NavOptions时开启保存、恢复状态的开关即可,示例代码如下:findNavController(R.id.homeFragmentContainerView).navigate( R.id.target_destination_id, null, NavOptions.Builder() // 弹出栈时保存当前目的地的状态 .setPopUpTo(R.id.current_destination_id, inclusive = false, saveState = true) // 导航到目标目的地时优先恢复已保存的状态 .setRestoreState(true) .build() ) - 第三步:多Tab场景可直接复用NavigationUI工具方法
如果你是自定义Tab切换逻辑,不需要自己实现状态保存逻辑,直接调用NavigationUI提供的onNavDestinationSelected方法即可,它内部已经封装好了多返回栈的状态保存、恢复逻辑,示例代码如下:// 自定义Tab点击事件中直接调用 customTab.setOnClickListener { tabMenuItem -> val navController = findNavController(R.id.homeFragmentContainerView) NavigationUI.onNavDestinationSelected(tabMenuItem, navController) }
注意:所有对NavHost内部Fragment的操作都要通过NavController执行,不要直接通过FragmentManager操作Fragment,否则会破坏NavController的状态管理逻辑,导致状态恢复失效。你当前布局中已经配置了
app:defaultNavHost="true",符合多返回栈的配置要求,不需要修改布局。
内容的提问来源于stack exchange,提问作者Bincy Baby
相关产品推荐
相关产品推荐

