FragmentManager NullPointerException异常试图commitAllowingStateLoss时 [英] FragmentManager NullPointerException when trying to commitAllowingStateLoss

查看:309
本文介绍了FragmentManager NullPointerException异常试图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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆