2

Haben Sie ein interessantes Problem mit der Transaktion auf Fragmenten nur auf Android Lollipop. Absturz passiert, wenn ich zurück gehe und zuvor hinzugefügte Fragmente entferne.NullPointerException: Versuch, von Feld zu lesen 'int android.app.Fragment.mContainerId' auf einem Nullobjektreferenz

Hier ist Stacktrace:

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) 

Wie ich Transaktion tue:

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> 

Wie ich es entfernen:

getFragmentManager().beginTransaction() 
      .remove(listFragment) 
      .commit(); 

Und ich bekomme den Absturz beim letzten Codefragment.

UPDATE

Nachdem ich entfernt hatte hat es keine Abstürze mehr:

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

Warum entfernen Sie das Fragment explizit statt Zugabe zu Backstack? –

+0

@MohammedAtif Es gibt einige andere Codezeilen, um bestimmte Änderungen vorzunehmen. – Magirus

+0

Mögliches Duplikat von [Was ist eine NullPointerException, und wie behebe ich sie?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Zoe

Antwort

1

Der Deal war in getFragmentManager() Methode nicht zu verwenden und getSupportFragmentManager() stattdessen verwenden und von v4.app.Fragment Klasse zu erweitern. Nachdem ich von android.app.Fragment ausgezogen wurde, funktioniert es jetzt ohne Abstürze.

Also meine Empfehlung für alle, wenn Sie solche Verwendungen von getFragmentManager() haben und Sie haben jemand Unterstützung Bibliotheken in Ihrer App dann nur zum Support-Manager bewegen. Auch es funktioniert für dich. Oder Sie können den Absturz mit einem seltsamen Bug treffen, wie ich es tat. Danke an alle, die Zeit haben, mir Ratschläge zu geben!

0

Die Ersetzen-Funktion entfernt zuvor Fragmente bei R.id.list_holder hinzugefügt und fügt das neue Fragment hinzu. Wenn Sie also Ihr Fragment entfernen, kann es vom System nicht gefunden werden, da es bereits durch die Ersetzungsfunktion entfernt wurde.

0

Ich hatte ein ähnliches Problem und ich war falsch zu rufen addToBackStack() beim Hinzufügen ersten Fragment in das Layout. Habe es entfernt und es funktioniert gut. Offensichtlich funktioniert es in höheren Android-Level wie O.

0

ich diesen Fehler wurde immer während tun Fragment Transaktion auf Fragment, das in FragmentManager existiert nicht:

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

Fragment mit "MyTag" existiert nicht in FragmentManager, so FragmentTransaction versucht Job auf null zu tun Fragment.

0

Ich habe versucht, Null aus Fragment-Manager zu entfernen. Diese

war der eigentliche Code:

broadcastFragment = null; 
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit(); 
Verwandte Themen