oynix

于无声处听惊雷,于无色处见繁花

DialogFragment的onViewCreated未调用问题

在用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
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。

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2022/04/3681fc671c81/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道