FragmentManager NullPointerException异常试图commitAllowingStateLoss时 [英] FragmentManager NullPointerException when trying to commitAllowingStateLoss
问题描述
背景:我有一个活动
与片段
3 InnerFragments
。当片段
的onDestroy()
是所谓的,我想从取下内片段 FragmentManager
。从的onDestroy()
的code是如下。
问题: FragmentManager
抛出 NullPointerException异常
,大概在 commitAllowingStateLoss()
被调用。我不明白为什么。
@覆盖
公共无效的onDestroy()
{
super.onDestroy();
如果(getFragmentManager()。findFragmentById(R.id.fragment_framelayout_left)!= NULL)
{
FragmentTransaction fragmentTransaction = getFragmentManager()的BeginTransaction()。
fragmentTransaction.remove(mLeftFragment);
fragmentTransaction.commitAllowingStateLoss();
}
}
堆栈跟踪:
12月2号至一十一日:15:14.162:E / AndroidRuntime(25911):致命异常:主要
12月2日至11号:15:14.162:E / AndroidRuntime(25911):显示java.lang.NullPointerException
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1419)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在android.support.v4.app.FragmentManagerImpl $ 1.运行(FragmentManager.java:429)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在android.os.Handler.handleCallback(Handler.java:725)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在android.os.Handler.dispatchMessage(Handler.java:92)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在android.os.Looper.loop(Looper.java:137)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在android.app.ActivityThread.main(ActivityThread.java:5039)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在java.lang.reflect.Method.invokeNative(本机方法)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在java.lang.reflect.Method.invoke(Method.java:511)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12月2日至11号:15:14.162:E / AndroidRuntime(25911):在dalvik.system.NativeStart.main(本机方法)
在 FragmentManager
管理所有片段
的活动
的水平,他们的生命周期将被捆绑到母活动
。孩子片段
管理器管理所有的片段
在片段
水平和它们的生命周期将被捆绑到母片段
。
所以,为您的手机架构,添加 InnerFragment
您活动
使用 getFragmentManager( )
。当活动
破坏为好(通过后退按钮/ 完成()
)的 FragmentManager
会破坏并释放 InnerFragment
给你。
有关您的平板电脑架构,添加 InnerFragments
您片段
使用 getChildFragmentManager()
(在最新的支持库)。当片段
破坏为好,在 FragmentManager
会破坏并释放 InnerFragments
给你。
您应该没有管理发布和摧毁你的片段
自己。我建议你记录你的的生命周期事件活动
和片段
,所以你可以看他们通过自己的状态,并确保正确的行为。
Context: I have an Activity
with a Fragment
and 3 InnerFragments
. When the Fragment
onDestroy()
is called, I want to remove the inner fragments from the FragmentManager
. The code from onDestroy()
is below.
Problem: FragmentManager
throws NullPointerException
, probably when commitAllowingStateLoss()
is called. I don't understand why.
@Override
public void onDestroy()
{
super.onDestroy();
if (getFragmentManager().findFragmentById(R.id.fragment_framelayout_left) != null)
{
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.remove(mLeftFragment);
fragmentTransaction.commitAllowingStateLoss();
}
}
Stack trace:
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)
The FragmentManager
manages all Fragments
at the Activity
level, and their lifecycle will be tied to that parent Activity
. The child Fragment
manager manages all Fragments
at the Fragment
level, and their lifecycle will be tied to that parent Fragment
.
So for your phone architecture, add your InnerFragment
to your Activity
using getFragmentManager()
. When the Activity
destroys for good (via back button / finish()
), the FragmentManager
will destroy and release the InnerFragment
for you.
For your tablet architecture, add your InnerFragments
to your Fragment
using getChildFragmentManager()
(in the latest support library). When the Fragment
destroys for good, the FragmentManager
will destroy and release the InnerFragments
for you.
You should not have to manage releasing and destroying your Fragments
yourself. I'd recommend logging the lifecycle events of your Activities
and Fragments
so you can watch them go through their states and ensure correct behavior.
这篇关于FragmentManager NullPointerException异常试图commitAllowingStateLoss时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!