Fragment UI界面不显示

一、问题及原因
二、onViewCreated()调用
  1.onViewCreated()什么时候被调用
  2.正确使用姿势


问题及原因

fragment界面不显示


Fragment UI界面不显示_第1张图片
fragment界面不显示
Fragment UI界面不显示_第2张图片
正常显示页面

经过debug发现VoucherListFragment的onCreate()方法调用了,但onViewCreated()没有被调用,而VoucherListFragment的UI布局就是在onViewCreated()方法的inflate的,该方法没有被调用,UI界面自然就展示不出来!那onViewCreated()为啥没被调用呢?

onViewCreated()调用

1.onViewCreated()什么时候被调用

通过查看源码,发现onViewCreated()在FragmentManager的moveToState()方法中被调用,如下所示,但调用的条件是f.mView不为空,f.mView由Fragment的performCreateView()方法创建:

Fragment UI界面不显示_第3张图片

继续看performCreateView()方法:

Fragment UI界面不显示_第4张图片

performCreateView()调用了onCreateView(),也就是f.mView由onCreateView()创建,fragment第一次绘制它的用户界面的时候, 系统会调用此方法。onCreateView()返回为null时,onViewCreated()就不会被调用!继续看看onCreateView()

Fragment UI界面不显示_第5张图片

可以看到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()

你可能感兴趣的:(Fragment UI界面不显示)