美文网首页
Fragment UI界面不显示

Fragment UI界面不显示

作者: 叛逆的青春不回头 | 来源:发表于2017-05-10 10:55 被阅读0次

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


    问题及原因

    fragment界面不显示


    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()

    相关文章

      网友评论

          本文标题:Fragment UI界面不显示

          本文链接:https://www.haomeiwen.com/subject/csiwtxtx.html