上下文:我有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