导航抽屉中Fragment生命周期探究:切换时会销毁、暂停还是重建?
导航抽屉中Fragment的生命周期与切换状态解析
一、Fragment填充至主Activity后的完整生命周期流程
Fragment从依附到Activity到最终销毁,会依次触发以下生命周期方法:
- onAttach():Fragment与Activity建立关联,可在此获取宿主Activity的实例
- onCreate():Fragment初始化阶段,完成数据加载、全局变量初始化等核心准备工作
- onCreateView():创建Fragment的视图布局,返回布局的根View对象
- onViewCreated():视图创建完成后调用,适合在此绑定控件、设置事件监听
- onStart():Fragment变为可见状态,但尚未获得交互焦点
- onResume():Fragment可见且获得焦点,处于活跃状态,可正常响应用户操作
- onPause():Fragment失去焦点但仍可见(如被弹窗遮挡),停止响应用户交互
- onStop():Fragment完全不可见,可在此释放非必需资源
- onDestroyView():Fragment的视图被销毁,释放所有与视图绑定的资源(如控件引用)
- onDestroy():Fragment实例即将被销毁,释放所有持有的资源
- onDetach():Fragment与Activity解除关联,彻底脱离宿主
二、导航抽屉菜单项切换时已存在Fragment的状态
状态取决于你采用的切换实现方式,常见两种场景:
1. 官方Navigation组件默认切换(replace方式)
这是导航抽屉最常用的实现方式,此时:
- 切换到新Fragment时,原Fragment会依次执行
onPause() → onStop() → onDestroyView(),但Fragment实例本身不会被销毁(onDestroy()和onDetach()不会触发),实例仍保留在内存中,成员变量的数据会被保留。 - 再次切回该Fragment时,会重新执行
onCreateView() → onViewCreated() → onStart() → onResume(),视图会被重建,但实例的状态数据无需重新加载。
2. 自定义hide/show切换方式
如果通过FragmentTransaction.add()添加Fragment,切换时使用hide()和show()方法:
- 切换到新Fragment时,原Fragment仅会执行
onPause()(若失去焦点),视图和实例都会被保留,只是界面被隐藏。 - 再次切回时,直接执行
onStart() → onResume(),无需重建视图,切换效率更高。
内容的提问来源于stack exchange,提问作者user21958688
相关产品推荐
相关产品推荐

