【问题标题】:NullPointerException: Attempt to read from field 'int android.app.Fragment.mContainerId' on a null object referenceNullPointerException:尝试从空对象引用上的字段“int android.app.Fragment.mContainerId”读取
【发布时间】:2017-06-01 09:01:58
【问题描述】:

仅在 Android Lollipop 上的片段事务上存在一些有趣的问题。当我返回并删除之前添加的片段时会发生崩溃。

这里是堆栈跟踪:

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);

幻灯片右:

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

【问题讨论】:

标签: java android android-fragments android-fragmentactivity


【解决方案1】:

交易是不使用getFragmentManager() 方法,而是使用getSupportFragmentManager() 并从v4.app.Fragment 类扩展。 在我从android.app.Fragment 移出后,它现在可以正常工作而不会崩溃。

因此,如果您有 getFragmentManager() 的此类用途,并且您的应用程序中使用了任何支持库,那么我对所有人的建议就是转到支持经理。即使它对你有用。或者你可以像我一样遇到一些奇怪的错误。感谢所有有时间给我建议的人!

【讨论】:

  • 我面临着同样的问题。能否请您提供更多信息。
【解决方案2】:

我在对 FragmentManager 中不存在的 Fragment 执行 Fragment Transaction 时遇到此错误:

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

FragmentManager 中不存在带有“MyTag”的片段,因此FragmentTransaction 尝试对空片段执行工作。

【讨论】:

  • 谢谢,我遇到了同样的问题。你节省了我的时间(y)
【解决方案3】:

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

这是实际的代码:

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

【讨论】:

    【解决方案4】:

    replace 函数会移除之前在 R.id.list_holder 中添加的片段,并添加新的片段。所以,当你删除你的片段时,系统找不到它,因为它已经被替换功能删除了。

    【讨论】:

      【解决方案5】:

      我遇到了类似的问题,在将第一个片段添加到布局中时,我错误地调用了 addToBackStack()。已将其删除,并且效果很好。 很明显,它可以在更高的 Android 级别上运行,例如 O

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-03
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        相关资源
        最近更新 更多