当FragmentDialog+ViewModel遇上onConfigurationChanged
今天在调试多国语言时候,出现一个问题:
操作
一个ViewPager里面有四个Fragment,然后其中一个Fragment(A)里面又有几个Fragment:A1,A2,A3,对应ViewMode(V1,V2,V3,V4)。进行如下操作: A1里面调用V1请求数据,弹出DialogFragment(D1),关闭,然后去A2里面调用VM2请求数据,弹出DialogFragment(D2),到设置页面切换语言,在回到App。
现象
此时,页面重绘,A切换到页面A1,A1却显示了2个D1,2个D2一共4个DialogFragment。
其他使用到Fragment(add、hide)操作的地方也存在多次onCreate的问题,而ViewPager里面的不会
探索
- 打印生命周期,发现:
- 切换语言时,Activity重新走生命周期,所在Fragment也会走一遍
- DialogFragment D1 onAttch()在Activity、A、A1、之前
- A1 onCreate()后,V1里面的liveData触发了回调,又弹出了一个D1,V2也是如此,弹出了D2。
- 我们使用DiaglogFragment取代Dialog可能目的之一就是在旋转屏幕时,数据也保存;而Google最新推出的ViewModel也是保存数据的手段之一。当他们一起工作时,就造成了现在尴尬的情况:出现了2个DialogFragment。
分析
- DialogFramment使用是否有问题 todo
- DialogFragment 或 Fragment的数据恢复原理 todo
- ViewModel的数据恢复原理 todo
- FragmentManager 和 ChildFragmentManager的关系 todo
项目繁忙,如有知情人士能看到,可否能解答一二。