尝试commitAllowingStateLoss时FragmentManager NullPointerException

Bog*_*rac 8 android android-fragments android-fragmentactivity

上下文:我有Activitya Fragment和3 InnerFragments.当Fragment onDestroy()被调用时,我想从取下内片段FragmentManager.代码来自onDestroy()下方.

问题: FragmentManager投掷NullPointerException,可能在commitAllowingStateLoss()被调用时.我不明白为什么.

@Override
public void onDestroy()
{
    super.onDestroy();
    if (getFragmentManager().findFragmentById(R.id.fragment_framelayout_left) != null)
    {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.remove(mLeftFragment);
        fragmentTransaction.commitAllowingStateLoss();
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

02-11 12:15:14.162: E/AndroidRuntime(25911): FATAL EXCEPTION: main
02-11 12:15:14.162: E/AndroidRuntime(25911): java.lang.NullPointerException
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1419)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.os.Handler.handleCallback(Handler.java:725)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.os.Looper.loop(Looper.java:137)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.app.ActivityThread.main(ActivityThread.java:5039)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at java.lang.reflect.Method.invokeNative(Native Method)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at java.lang.reflect.Method.invoke(Method.java:511)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

Ste*_*yle 9

FragmentManager所有管理FragmentsActivity水平,它们的生命周期将被捆绑到母公司Activity.孩子Fragment的经理管理所有FragmentsFragment水平,它们的生命周期将被捆绑到母公司Fragment.

因此,对于您的手机架构,请添加您InnerFragmentActivity使用getFragmentManager().当Activity破坏为好(通过后退按钮/ finish())时,FragmentManager将破坏并释放InnerFragment给你.

对于您的平板电脑架构,请将您InnerFragmentsFragment使用添加到您的使用中getChildFragmentManager()(在最新的支持库中).当Fragment破坏为好时,FragmentManager将破坏并释放InnerFragments为你.

你不应该管理释放和摧毁Fragments自己.我建议你登录的生命周期事件Activities,并Fragments让您可以观看他们通过他们的状态,并确保正确的行为.