上下文:我有Activity
与Fragment
和3 InnerFragments
。当调用Fragment
onDestroy()
时,我想从FragmentManager
中删除内部片段。下面的代码来自onDestroy()
。FragmentManager NullPointerException当试图commitAllowingStateLoss
问题: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();
}
}
堆栈跟踪:
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)
我不会完全按照你的架构。 'InnerFragments'是否存在于'Fragment'中?如果是这样,我认为你应该有'getChildFragmentManager()'管理它们(而不是'''''FragmentManager')。这样,当“碎片”破坏时,其子节点“InnerFragments”也会被破坏,而无需额外的代码。 – 2013-02-12 04:14:30
是的,内碎片住在碎片内(至少在平板电脑上)。在手机上,他们生活在一个Activity内(Activity1内的InnerFragment1,Activity2内的InnerFragment2)。这就是我使用该代码的原因。它也可以在Activities中使用getChildFragmentManager()吗? LE:愚蠢的问题,对不起。我会在几个小时内尝试一下你的想法,看看它是如何发展的。 – 2013-02-12 12:44:02
'getChildFragmentManager()'只在'Fragments'中,因为'Activities'不能访问子'FragmentManagers'。然而,'Fragments'可以调用'getFragmentManager()'并访问其父'Activity'的'FragmentManager',允许他们在自己的顶部启动新的'Fragments',而不需要他们的父'Activity'来为他们做。 – 2013-02-12 14:23:51