錯誤發生在 FragmentStatePagerAdapter 恢復狀態時:
java.lang.NullPointerException
at android.support.v4.app.Fragment.instantiate(Fragment.java:399)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(...)
at android.support.v4.view.ViewPager.populate(...)
核心原因:父 Fragment 被銷毀時,子 FragmentManager 狀態未正確清理,導致重建時嘗試實例化已不存在的子 Fragment。
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (Exception e) {
e.printStackTrace();
}
}
mChildFragmentManager 是 Fragment 內部管理嵌套 Fragment 的實例。null,強制下次創建時重新初始化,避免狀態衝突。若 minSdkVersion >= 17,可使用官方 API 替代反射:
@Override
public void onDetach() {
super.onDetach();
if (getChildFragmentManager() != null) {
getChildFragmentManager().beginTransaction().commitNowAllowingStateLoss();
}
}
getChildFragmentManager(),而非 getFragmentManager()。FragmentStatePagerAdapter 時,確保 getItemPosition 返回 POSITION_NONE 以強制刷新。commitNowAllowingStateLoss() 而非 commit(),防止狀態丟失異常。