我有3个片段,一个NavigationDrawer,一个MapFragment和一个用户定义的"MapInfoFragment".我希望"MapInfoFragment"在某些事件上在MapFragment顶部显示为半透明,在其他事件上消失.如果我每次都完全删除片段并创建一个新片段,或者我只是更改显示的可见性和信息,我真的不在乎.目前我只是尝试使用FragmentManager的.hide()函数,但我也尝试过.remove和.detach,结果相似.
错误:
03-18 14:28:10.965 24711-24711/com.[packageName].asTest D/AndroidRuntime? Shutting down VM 03-18 14:28:10.965 24711-24711/com.[packageName].asTest E/AndroidRuntime? FATAL EXCEPTION: main Process: com.[packageName].asTest, PID: 24711 java.lang.NullPointerException: Attempt to write to field 'int android.app.Fragment.mNextAnim' on a null object reference at android.app.BackStackRecord.run(BackStackRecord.java:658) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
activity_main.xml中:
违规守则:
FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.hide(getFragmentManager().findFragmentById(R.id.map_info)); ft.commit();
我改变map_info_layout
了map_info
,我得到的错误没有变化.我之前已经map_info_layout
定义为MapInfoFragment布局xml的根FrameLayout的id,所以我认为map_info_layout
并map_info
指向同样的事情.
事实证明我MapInfoFragment
延伸android.support.v4.app.Fragment
而不是android.app.Fragment
和我使用android.app.FragmentTransaction
而不是android.support.v4.app.FragmentTransaction
.切换所有内容,android.app.
因为我对旧设备兼容性不感兴趣.谢谢Fllo.
停止尝试隐藏空对象
我知道你自己已经解决了这个问题,但我想解释一下这个错误是如何发生的,因为它刚好发生在我身上.
基本上你打电话hide()
,remove()
等,用一个空值.
错误并不明显,当发生这种情况时,堆栈跟踪不会源自您自己的源,因此实现它的目的并非易事.
当你FragmentManager.popBackstack()
在没有后台堆叠片段的情况下打电话时也会发生这种情况.
这是因为您添加或显示或隐藏现在为null的片段,在使用它之前尝试检查它是否为null!