一、问题及原因
二、onViewCreated()调用
1.onViewCreated()什么时候被调用
2.正确使用姿势
问题及原因
fragment界面不显示
经过debug发现VoucherListFragment的onCreate()
方法调用了,但onViewCreated()
没有被调用,而VoucherListFragment的UI布局就是在onViewCreated()
方法的inflate的,该方法没有被调用,UI界面自然就展示不出来!那onViewCreated()
为啥没被调用呢?
onViewCreated()调用
1.onViewCreated()什么时候被调用
通过查看源码,发现onViewCreated()
在FragmentManager的moveToState()
方法中被调用,如下所示,但调用的条件是f.mView不为空,f.mView由Fragment的performCreateView()
方法创建:
继续看performCreateView()
方法:
performCreateView()
调用了onCreateView()
,也就是f.mView由onCreateView()
创建,fragment第一次绘制它的用户界面的时候, 系统会调用此方法。当onCreateView()
返回为null时,onViewCreated()
就不会被调用!继续看看onCreateView()
:
可以看到onCreateView()
默认是返回null的,也就是如果子类fragment不覆写该方法的话,onViewCreated()
就不会被调用。如果覆写该方法就返回fragment的界面View,onViewCreated()
被调用,还可以看到onViewCreated()
的方法说明中,参数view就是onCreateView()
返回的View。
2.正确使用姿势
由以上可知从生命周期而言,Fragment在onCreateView
运行完成后,Fragment中才创建添加了子组件,所以至少要在onViewCreated
中,才能用 fragment.getView().findViewById(R.id.xxx)获取子组件的引用。也就是说如果Fragment有UI视图的话会先执行onCreateView()
→onViewCreated()
:
(1)添加一个无UI的Fragment:需要从Activity使用add(Fragment, String)
来添加Fragment (为Fragment提供一个唯一的字符串"tag", 而不是一个View ID)。这么做添加了fragment,但它并没有关联到Activity Layout中的一个View,此时不用覆写onCreateView()
,onCreateView()
默认返回null。这个时候不执行onCreateView()
和onViewCreated()
方法;
(2)添加提供UI的Fragment:为宿主activity提供UI的一部分, 此时必须实现onCreateView()
方法,返回一个Fragment布局Layout的根View。 当到了Fragment绘制它自己的Layout的时候,Android系统调用它。这个时候执行onCreateView()
→onViewCreated()
。