在前文 Android ViewPager 中 Fragment 懒加载 中介绍了 Fragment 懒加载的实现,在后期项目运用中对 Fragment 中 View 的加载也实现了在首次展示时才进行填充,结果遇到了如下一个问题:
当 Fragment 被销毁重建时,其中嵌套的 Fragment 界面没有被展示,但是 isAdd()
结果为 true。
研究后发现,在 Fragment 中嵌套使用 Fragment 时,当父 Fragment 被销毁时,子 Fragment 不会被销毁。
我们平时加载 Fragment 时会通过 findFragmentByTag
进行复用,这便导致父 Fragment 重建时会根据保存的子 Fragment 的 TAG 去直接加载子 Fragment,而不是重建一个子 Fragment。此时子 Fragment 由于懒加载机制,它的 View 不会再次被填充到父 Fragment 中。也就是在重建后的父 Fragment 中,子 Fragment 会被 onAttach,但它的 View 不会被 add。
解决办法:在父 Fragment 的 savedInstanceState 中移除保存的子 Fragment 的 TAG 信息。
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null) {
/**
* key 参考 {@link FragmentActivity.FRAGMENTS_TAG}
*/
savedInstanceState.remove("android:support:fragments");
}
super.onCreate(savedInstanceState);
}