正常情况下,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在哪调用的,查一下引用就很容找到了这个方法,
1234567
// Fragment.javavoid performViewCreated() { // since calling super.onViewCreated() is not required, we do not need to set and check the // `mCalled` flag onViewCreated(mView, mSavedFragmentState); mChildFragmentManager.dispatchViewCreated();}
接着,再查一下performViewCreated在哪调用的,然后就来到了这,
1234567891011
// FragmentStateManager.javavoid createView() { ... mFragment.performCreateView(layoutInflater, container, mFragment.mSavedFragmentState); if (mFragment.mView != null) { ... mFragment.performViewCreated(); ... } ...}
最后,一下就触碰到了最底层柔软的答案,performCreateView之后,如果mView不为null,则执行performViewCreated。