2017-06-01 78 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(); 
相關問題