在用DialogFragment写弹窗时,遇到了一个问题,就是onViewCreated回调没走,在此做个记录。
正常情况下,DialogFragment的生命周期是这样的
1 | onAttach -->onCreate-->onCreateDialog-->onCreateView-->onViewCreated-->onSaveInstanceState |
创建Dialog有两种方式,一是重写onCreateDialog,另一个是重写onCreateView,具体还要看需求。
我用的是前者,返回Dialog可定制性稍微强一些,但是写在onViewCreated里的逻辑却没走,检查下来发现了之前疏忽的一个点:onCreateView默认返回的null,而onViewCreated只有在onCreateView返回不为null时才会调用,就像超市里的捆绑销售,create view之后,才能在view created中拿到create的view,这样也合理,之前我一直以为onViewCreated里拿到的就是窗口view。
源码大概是这样写的,其实也很好排查,就看下onViewCreated在哪调用的,查一下引用就很容找到了这个方法,
1 | // Fragment.java |
接着,再查一下performViewCreated在哪调用的,然后就来到了这,
1 | // FragmentStateManager.java |
最后,一下就触碰到了最底层柔软的答案,performCreateView之后,如果mView不为null,则执行performViewCreated。