Android Navigation组件2.5.2版本:如何禁用状态保存(Java)
1. 禁用单个目的地的状态保存
如果仅针对特定Fragment/Activity目的地,直接在导航图的目的地定义中添加android:saveEnabled="false"属性,即可阻止该目的地的视图状态及关联的SavedStateHandle数据被保存:
<fragment android:id="@+id/targetFragment" android:name="com.example.app.TargetFragment" android:saveEnabled="false" app:label="Target Fragment" />
设置后,离开该目的地再返回时,会重新创建实例,不会恢复之前的状态。
2. 单次导航时强制不恢复状态
若无需永久禁用,仅在某次导航操作时不恢复目标目的地的保存状态,可通过NavOptions设置setRestoreState(false):
findNavController().navigate( R.id.action_from_current_to_target, null, NavOptions.Builder() .setRestoreState(false) .build() )
该配置会让本次导航到目标目的地时,忽略之前保存的状态,直接创建新实例。
3. 全局禁用整个NavHost的状态保存
如果需要完全禁用整个导航视图(NavHostFragment)的状态保存,可以自定义NavHostFragment并跳过状态保存逻辑:
class NoSaveStateNavHostFragment : NavHostFragment() { override fun onSaveInstanceState(outState: Bundle) { // 不调用父类方法,阻止NavHost保存任何状态 } }
随后在布局文件中用这个自定义类替代默认的NavHostFragment:
<fragment android:id="@+id/nav_host_fragment" android:name="com.example.app.NoSaveStateNavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/nav_graph" />
注意:这种方式会完全禁用整个导航栈的状态保存,包括所有目的地的状态,需根据场景谨慎使用。
补充说明
你之前修改导航图中的Action属性无效,是因为状态保存的控制逻辑绑定在目的地而非Action上,需针对目的地或导航操作本身做配置,而非修改Action参数。
内容的提问来源于stack exchange,提问作者M Umer
相关产品推荐
相关产品推荐

