2016-07-02 20 views
0

Dies ist ein seltsamer Fehler, mit dem ich im Moment zu kämpfen habe.Fragment bereits mit SwipeRefreshLayout hinzugefügt

Ich habe eine Aktivität, die ein Suchfragment anzeigt, sobald es die Initialisierung abgeschlossen hat. Das Suchfragment enthält eine Listenansicht zum Anzeigen der Ergebnisse und diese Listenansicht befindet sich in einem SwipeRefreshLayout, damit der Benutzer die Suchergebnisse aktualisieren kann.

Wenn der Benutzer ein Element aus der Liste auswählt, wird das Suchfragment entfernt und die übergeordnete Aktivität angezeigt (sie enthält andere Fragmente). Der Benutzer kann wählen, das Suchfragment zu öffnen und die Ergebnisse zu aktualisieren, wenn sie dies wünschen.

Das Verhalten, das ich habe, ist, dass, wenn sie die Swipe-Aktualisierung verwenden, wenn das Fragment zum ersten Mal geöffnet wird, es wie erwartet funktioniert. Wenn sie jedoch das Suchfragment schließen und es dann erneut öffnen und dann zum Aktualisieren nach unten wischen, wird die Ausnahme java.lang.IllegalStateException: Fragment already added für das Suchfragment ausgelöst.

Der Code der Such fragmentieren das erste Mal einzuführen, ist:

@Override 
protected void onPostExecute(Void empty) { 
    dismissSearchProgress(); 
    getFragmentManager().beginTransaction(). 
     setCustomAnimations(R.animator.slide_in_left, 0, 0, R.animator.slide_out_left). 
     add(R.id.main_vwContent, mWoSearchFragment).commit(); 
} 

Das zweite Mal, wenn der Code über eine Swipe-Aktion auf dem Bildschirm eingeführt wird:

case MotionEvent.ACTION_UP: 
    if (swipeInRange) { 
     /* do some other stuff */ 
     getFragmentManager().beginTransaction().setCustomAnimations(R.animator.slide_in_left, 0, 0, R.animator.slide_out_left).add(R.id.main_vwContent, mWoSearchFragment).commit(); 
    } 
    break; 

Es gibt keine Fehler geworfen in der zweiten Instanz, es sei denn, sie wischen zum Aktualisieren nach unten. Der Fehler wird ausgelöst, bevor das Ereignis onRefresh ausgelöst wird.

Wer hat irgendwelche Ideen? Nicht sicher, welcher Code versucht, das Suchfragment erneut hinzuzufügen, da die Ausnahme in der Stack-Ablaufverfolgung keinen Code enthält und der Debugger nichts fängt.

Antwort

0

Es ist erstaunlich, was das Aufschreiben eines Problems für Sie tun wird. Das Problem bestand darin, dass zum Öffnen des Fragments der Benutzer von einer bestimmten Bildschirmposition aus wischen musste. Also unter MotionEvent.ACTION_DOWN überprüfen wir, ob sie innerhalb des Zielbereichs gestartet sind und setzen eine Flagge. Dann wird bei 'MotionEvent.ACTION_UP' das Fragment hinzugefügt. Im Fall eines SwipeRefreshLayout fängt es jedoch das Ereignis 'MotionEvent.ACTION_DOWN' ab, es schiebt jedoch 'MotionEvent.ACTION_UP' auf den Stapel.

In meinem Fall wurde das Flag immer noch auf "true" gesetzt, da die letzte Aktion, die vor der Aktualisierung ausgeführt wurde, das Hinzufügen des Fragments war.

Die Fehlerbehebung bestand darin, sicherzustellen, dass das Flag beim Hinzufügen des Suchfragments auf false zurückgesetzt wurde.

Verwandte Themen