【记录】当FragmentDialog+ViewModel遇上onConfigurationChanged

1,772 阅读1分钟

当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里面的不会

探索

  1. 打印生命周期,发现:
  • 切换语言时,Activity重新走生命周期,所在Fragment也会走一遍
  • DialogFragment D1 onAttch()在Activity、A、A1、之前
  • A1 onCreate()后,V1里面的liveData触发了回调,又弹出了一个D1,V2也是如此,弹出了D2
  1. 我们使用DiaglogFragment取代Dialog可能目的之一就是在旋转屏幕时,数据也保存;而Google最新推出的ViewModel也是保存数据的手段之一。当他们一起工作时,就造成了现在尴尬的情况:出现了2个DialogFragment。

分析

  1. DialogFramment使用是否有问题 todo
  2. DialogFragment 或 Fragment的数据恢复原理 todo
  3. ViewModel的数据恢复原理 todo
  4. FragmentManager 和 ChildFragmentManager的关系 todo

项目繁忙,如有知情人士能看到,可否能解答一二。