删除碎片时崩溃

4

我遇到了一个相当神秘的平板电脑崩溃问题:

java.lang.NullPointerException: Attempt to read from field 'int android.support.v4.app.Fragment.mContainerId' on a null object reference                                                                          
   at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1012)                                                                          
   at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:971)                                                                          
   at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:95)                                                                          
   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2143)                                                                          
   at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)                                                                          
   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)                                                                          
   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)                                                                          
   at android.os.Handler.handleCallback(Handler.java:751)                                                                          
   at android.os.Handler.dispatchMessage(Handler.java:95)                                                                          
   at android.os.Looper.loop(Looper.java:154)                                                                          
   at android.app.ActivityThread.main(ActivityThread.java:6077)                                                                          
   at java.lang.reflect.Method.invoke(Native Method)                                                                          
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)                                                                          
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

这只发生在我的api 24 Pixel C上。调试模式无法帮助我找出原因。当我点击一个删除片段的按钮时发生,但是代码中“删除片段”部分被正确执行,某些事情发生在我的OnClickListener执行之后。

我已经移除了事务动画,仍然会发生崩溃。

有人遇到过这种情况吗?

谢谢。


你可以发布你的代码处理“删除片段”吗? - RoShan Shan
1
@RoShanShan,我确实是用这种方法移除了片段,我已经更新了原帖并附上了解决方案。 - Renaud Favier
2个回答

0

看起来解决方案不是保留片段的引用,而是使用标签找到它:

之前:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
courseLauncherFragment = CourseLauncherFragment.newInstance(courseId);
fragmentTransaction.replace(R.id.launcher_finish_frame_layout, courseLauncherFragment);
fragmentTransaction.commit();
getSupportFragmentManager().executePendingTransactions();

然后将其删除:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left);
fragmentTransaction.remove(courseLauncherFragment);
fragmentTransaction.commit();

现在:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.launcher_finish_frame_layout, CourseLauncherFragment.newInstance(courseId), LAUNCHER_FRAGMENT_TAG);
fragmentTransaction.commit();
getSupportFragmentManager().executePendingTransactions();

然后:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left);
Fragment fragment = fragmentManager.findFragmentByTag(LAUNCHER_FRAGMENT_TAG);
fragmentTransaction.remove(fragment);
fragmentTransaction.commit();

0

在事务中删除 Fragment 之前应该检查其是否为 null。当我尝试删除一个为 null 的 Fragment 时,我也遇到了同样的问题。你可以在 这里 查看详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接