安卓 - Fragment生命周期问题

今天写一个安卓程序,发现一个切屏回来就闪退的问题,经过跟踪发现是因为切屏回来

这个第49行代码报错导致的,说的是_bindingnull 这?不对吧,

我一进来使用binding的话,我就会初始化啊,

再往上一层,发现是这里调用获取了binding?嗯?我的binding消失了?

binding置空是在另外一个地方onDestroyView里面哎?

Fragment生命周期

Fragment 生命周期状态,以及它们与 Fragment 的生命周期回调和 Fragment 的视图生命周期之间的关系

看这个图,按理说onSaveInstanceStateonDestroyView之前,为什么我的binding没了呢?

onStop() 与 onSaveInstanceState() 的调用顺序差异

错误原因

  • MainFragment切换到SubFragment导致触发MainFragment的销毁

  • 然后从SubFragment界面切换到后台,再切回来触发MainFragmentonSaveInstanceState(此时binding为空),故出现异常

修复方法就是加一层非null判断

替代解决办法

看来答案就在如何处理fragments上,即使fragment没有View,但 Activity 状态的变化仍会触发 onSavedInstanceState(),所以我们可能会遇到调用 onSavedInstanceState() 的时候没有View(binding)的情况。这似乎是有意为之,因为无论是否有Viewfragments都会触发这些回调监听?

建议使用view API 来保存和恢复状态(或 SavedStateRegistery)。

参考