NullPointerException:尝试从空对象引用上的字段'int android.app.Fragment.mContainerId'读取

时间:2017-06-01 09:01:58

标签: java android android-fragments android-fragmentactivity

仅在Android Lollipop上对片段进行交易时遇到一些有趣的问题。当我返回并删除以前添加的片段时发生崩溃。

这是stacktrace:

FATAL EXCEPTION: main
Process: com.parkme.consumer, PID: 15560
    java.lang.NullPointerException: Attempt to read from field 'int android.app.Fragment.mContainerId' on a null object reference
    at android.app.BackStackRecord$1.onPreDraw(BackStackRecord.java:1131)
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1970)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
    at android.view.Choreographer.doFrame(Choreographer.java:550)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我如何进行交易:

getFragmentManager().beginTransaction()
            .replace(R.id.list_holder, listFragment)
            .commit();

R.id.list_holder

<FrameLayout
        android:id="@+id/list_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</FrameLayout>

我如何删除它:

 getFragmentManager().beginTransaction()
            .remove(listFragment)
            .commit();

我收到了最后一段代码片段的崩溃。

更新

我删除后不再崩溃了:

Transition slideTransition = TransitionInflater.from(ParkmeApplication.getContext()).inflateTransition(R.transition.slide_right);
setExitTransition(slideTransition);

slide_right:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <slide
        android:duration="@android:integer/config_shortAnimTime"
        android:slideEdge="right"/>
</transitionSet>

5 个答案:

答案 0 :(得分:2)

我在Fragment上执行片段事务时遇到此错误,FragmentManager中不存在:

fragmentTransaction.hide(fragmentManager.findFragmentByTag("MyTag"));

片段与&#34; MyTag&#34;在FragmentManager中不存在,因此FragmentTransaction尝试在null Fragment上执行任务。

答案 1 :(得分:1)

该交易不使用getFragmentManager()方法而是使用getSupportFragmentManager()代替并从v4.app.Fragment类延伸。  在我离开android.app.Fragment后,它现在正在运行而没有崩溃。

所以,如果您对getFragmentManager()有这样的使用,并且您有任何人支持您的应用程序中使用的库,那么我建议所有人,然后转移到支持经理。即使它为你工作。或者你可以像我一样用一些奇怪的bug来击中崩溃。感谢所有有时间给我建议的人!

答案 2 :(得分:0)

replace函数删除先前在R.id.list_holder中添加的片段并添加新片段。因此,当您删除片段时,系统无法找到它,因为它已被替换功能删除。

答案 3 :(得分:0)

我遇到了类似的问题,在向布局添加第一个片段时,我错误地调用了addToBackStack()。删除它,它运作良好。 显而易见的是,它在较高的Android级别工作,例如O

答案 4 :(得分:0)

我试图从片段管理器中删除null。

这是实际的代码:

broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();