NullPointerException:尝试从字段 'int android.app.Fragment.mContainerId' 读取空对象引用
NullPointerException: Attempt to read from field 'int android.app.Fragment.mContainerId' on a null object reference
仅 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.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>
替换函数删除之前在 R.id.list_holder 添加的片段并添加新片段。因此,当您删除片段时,系统无法找到它,因为它已被替换功能删除。
协议是不使用 getFragmentManager()
方法,而是使用 getSupportFragmentManager()
并从 v4.app.Fragment
class 扩展。
在我从 android.app.Fragment
搬出后,它现在可以正常工作,没有崩溃。
因此,如果您对 getFragmentManager()
有这样的用途,并且有人支持您的应用程序中使用的库,那么我建议所有人转至支持管理器。即使它对你有用。或者你可以像我一样遇到一些奇怪的错误。感谢所有有时间给我建议的人!
我遇到过类似的问题,在将第一个片段添加到布局中时错误地调用了 addToBackStack()
。已将其删除并且效果很好。
很明显,它在更高的 Android 级别工作,例如 O
.
我在对 FragmentManager
中不存在的片段进行片段交易时遇到此错误:
fragmentTransaction.hide(fragmentManager.findFragmentByTag("MyTag"));
FragmentManager
中不存在具有 "MyTag" 的片段,因此 FragmentTransaction
尝试对空片段执行作业。
我试图从片段管理器中删除 null。
这是实际代码:
broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();
仅 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.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>
替换函数删除之前在 R.id.list_holder 添加的片段并添加新片段。因此,当您删除片段时,系统无法找到它,因为它已被替换功能删除。
协议是不使用 getFragmentManager()
方法,而是使用 getSupportFragmentManager()
并从 v4.app.Fragment
class 扩展。
在我从 android.app.Fragment
搬出后,它现在可以正常工作,没有崩溃。
因此,如果您对 getFragmentManager()
有这样的用途,并且有人支持您的应用程序中使用的库,那么我建议所有人转至支持管理器。即使它对你有用。或者你可以像我一样遇到一些奇怪的错误。感谢所有有时间给我建议的人!
我遇到过类似的问题,在将第一个片段添加到布局中时错误地调用了 addToBackStack()
。已将其删除并且效果很好。
很明显,它在更高的 Android 级别工作,例如 O
.
我在对 FragmentManager
中不存在的片段进行片段交易时遇到此错误:
fragmentTransaction.hide(fragmentManager.findFragmentByTag("MyTag"));
FragmentManager
中不存在具有 "MyTag" 的片段,因此 FragmentTransaction
尝试对空片段执行作业。
我试图从片段管理器中删除 null。
这是实际代码:
broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();