2017-06-01 89 views
2

仅在Android棒棒糖上有碎片事务有一些有趣的问题。当我回去并删除先前添加的片段时发生崩溃。NullPointerException:尝试从空字段'int android.app.Fragment.mContainerId'读取空对象参考

这里是堆栈跟踪:

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

我正在接收最后一个代码片段的崩溃。

UPDATE

i之后已经删除它了没有崩溃:

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> 
+0

你为什么要明确删除片段,而不是添加它来堆栈中的? –

+0

@MohammedAtif还有其他一些代码行可以进行特定的更改。 – Magirus

+0

可能的重复[什么是NullPointerException,以及如何解决它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) – Zoe

回答

1

本次交易不使用getFragmentManager()方法,而是使用getSupportFragmentManager()代替,并从v4.app.Fragment类延伸。 我从android.app.Fragment搬出后,它现在正在工作,没有崩溃。

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

0

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

0

我遇到了类似的问题,在将第一个片段添加到布局中时我错误地调用了addToBackStack()。已经删除它,它运作良好。 明显的是,它在更高的Android级别上工作,如O

0

我得到这个错误,而在片段做片段交易不中FragmentManager存在:

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

片段与“MyTag”在FragmentManager不存在,所以FragmentTransaction尝试做零工作分段。

0

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

这是实际代码:

broadcastFragment = null; 
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit(); 
相关问题