添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
英俊的蚂蚁  ·  Android ...·  3 周前    · 
有情有义的蜡烛  ·  DialogFragment ...·  3 周前    · 
小眼睛的紫菜  ·  Dialog ...·  3 周前    · 
逆袭的小笼包  ·  How to mock final ...·  3 月前    · 
好帅的香菜  ·  php ...·  3 月前    · 
暴走的黄豆  ·  Win 7中的greenlet : ...·  3 月前    · 

正常情况下,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
2
3
4
5
6
7
// Fragment.java
void 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在哪调用的,然后就来到了这,

1
2
3
4
5
6
7
8
9
10
11
// FragmentStateManager.java
void createView() {
...
mFragment.performCreateView(layoutInflater, container, mFragment.mSavedFragmentState);
if (mFragment.mView != null) {
...
mFragment.performViewCreated();
...
}
...
}

最后,一下就触碰到了最底层柔软的答案,performCreateView之后,如果mView不为null,则执行performViewCreated。