父Fragment的onCreateView中创建子Fragment的问题及生命周期疑问
问题:子Fragment重建导致重复实例的疑惑
我有一个包含可滚动表格列表的Fragment,表格每一行都是一个子Fragment。这些子Fragment都在父Fragment的onCreateView方法中创建,且没有无参构造函数。我原本以为它们不需要无参构造函数——毕竟没有布局引用这些子Fragment,Android应该会先调用父Fragment的onCreateView来重建它们。但实际情况是,Android有时会尝试调用子Fragment的无参构造函数。
如果给子Fragment添加无参构造函数并绑定全局数据结构,又会出现新问题:Android会自行创建所有子Fragment实例,之后父Fragment的onCreateView又会再创建一遍,导致列表里出现所有子Fragment的两个副本!
我有两个疑问:
- 在
onCreateView中创建视图或Fragment是不是不良实践?这里是不是只能调用findViewById?应该在onCreate或者父Fragment的构造函数里做这件事吗? - 当Android以这种方式重建页面时,会调用
onCreate还是onCreateView?
解答
关于疑问1
- 在
onCreateView中创建子Fragment属于不推荐的实践。onCreateView的核心职责是加载并返回父Fragment的布局视图,在此方法中执行子Fragment的初始化/添加操作,会和Android的Fragment重建机制冲突——系统在重建时会自动恢复之前添加的子Fragment,若你在onCreateView里再次创建添加,必然导致重复实例。 - 更合适的时机是在
onViewCreated或onStart中处理子Fragment的添加,但必须先通过getChildFragmentManager().findFragmentByTag()或findFragmentById()检查子Fragment是否已存在,避免重复创建。 - 绝对不要在父Fragment的构造函数中创建子Fragment:Fragment构造函数需保持轻量,且系统重建Fragment时会调用无参构造,此时上下文等依赖尚未初始化,极易引发异常。
onCreate方法也不适合,因为此时父Fragment的视图还未创建,子Fragment的视图容器可能不存在。
关于疑问2
- 当Android因配置变更(如屏幕旋转)重建页面时,父Fragment的
onCreate和onCreateView都会被调用。系统会先恢复Fragment实例(调用无参构造、onCreate),再调用onCreateView重建视图。而子Fragment的实例会被系统自动恢复,无需你在父Fragment中重新创建。
补充:Fragment重建的回调顺序(配置变更场景)
当包含子Fragment的父Fragment遇到屏幕旋转等Activity重建操作时,关键回调顺序如下:
- 每个子Fragment的
onSaveInstanceState - Activity后台重建
- 每个子Fragment的
onAttach - 父Fragment的
onCreateView - 每个子Fragment的
onCreateView→onViewStateRestored - 父Fragment的
onStart
注:此列表仅包含断点追踪到的关键回调,并非完整生命周期流程。
另外需注意:如果在onStart等回调中添加子Fragment,必须先检查子Fragment是否已存在,否则屏幕旋转后会出现重复实例。
内容的提问来源于stack exchange,提问作者Alim Ajiev
相关产品推荐
相关产品推荐

