2016-09-08 3 views
0

Ich habe die folgende Aktivitätssequenz in einem Ordner Picker Teil einer App:onActivityResult nur einmal genannt

Aktivität A beginnt B. B startet dann Instanzen von sich selbst, die stapeln, wenn der Benutzer tiefer in den Ordnerbaum hineingeht. Immer wenn eine Instanz von B abgeschlossen ist (Ordner gewählt), sollten sie und alle vorhergehenden B s beendet werden und A sollte erneut angezeigt werden, mit dem propagierten Ergebnis. Wenn der Benutzer zurückläuft, sollten die vorhergehenden B s nicht enden, da der Benutzer in der Lage sein sollte, zwischen den Ordnerunterbäumen hin und her zu gehen.

Ich versuche, dies zu tun durch startActivityForResult Verwendung sowohl von A zu B und dann für jede neue Instanz von B. Wenn der Benutzer eine Instanz B beendet, verwende ich setResult und möchte es in der onActivityResult-Methode jeder vorhergehenden Instanz überprüfen. Wenn es RESULT_OK ist, setze ich das Ergebnis erneut und beende diese Instanz, bis alle von ihnen in einer kaskadierenden Sequenz beendet sind und A erneut mit dem Ergebnis angezeigt wird.

Die Sequenz so lange funktioniert, wie ich gehen A =>B (1) =>B (2) =>B (3) und Ziel, ohne in der B Rückzieher Teil .

Allerdings, wenn ich gehe A =>B (1) =>B (2) => zurück zum B (1) =>B (3) und Ziel, onActivityResult wird nur in B (1) beim Zurückgehen von B (2) das erste Mal aufgerufen, nicht wenn ich später darauf zurück gehe, wenn ich von B (3) fertig bin. B (1) wird einfach wieder aufgenommen, wenn in dieser Reihenfolge von B (3) zurückgegangen wird. Dies unterbricht die kaskadierende Endsequenz.

Warum wird onActivityResult nur einmal aufgerufen, zum Beispiel B (1)? Sollte es nicht jedes Mal aufgerufen werden, wenn eine Kindaktivität ein Ergebnis setzt und beendet?

Hier einige Code:

=== Aktivität A:

die erste B Instanz starten:

Intent intent = new Intent(ActivityA.this, ActivityB.class); 
startActivityForResult(intent, RequestCodes.ActivityB); 

die endgültige B Ergebnis Empfang:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode == RESULT_OK){ 
    ... 
    } 
} 

=== Aktivität B:

starten neues Kind B von selbst:

Intent intent = new Intent(ActivityB.this, ActivityB.class); 
startActivityForResult(intent, RequestCodes.ActivityB); 

das Ergebnis einstellen, wenn Sie einen Ordner wählen:

Intent result = new Intent(); 
result.putExtra(...); 
setResult(Activity.RESULT_OK, result); 
finish(); 

das Kind Empfangen B Ergebnis in jedem Elternteil B Instanz (die aus irgendeinem Grunde nur das erste Mal in B (1) genannt wird):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode == RESULT_OK){ 
    setResult(Activity.RESULT_OK, data); 
    finish(); 
    } 
} 

Vielen Dank im Voraus.

+0

In der letzten Methode sollten Sie statt 'setResult (..., Daten)' Dies ist ein Tippfehler oder ein Fehler? –

+0

Das ist ein Tippfehler hier, ja, es sind Daten im Code. Vielen Dank. – Johe

Antwort

1

Dies ist eine schreckliche Architektur! Sie sollten nicht mehrere Instanzen von B erstellen, wenn Sie einen Baum durchlaufen. Irgendwann wird dir die Erinnerung ausgehen! Sie sollten eine einzelne Instanz Ihrer Activity verwenden und wenn sich der Benutzer in der Struktur nach oben oder unten bewegt, sollten Sie nur die Daten ändern, die Sie in der Activity anzeigen. Sie sollten über ein internes Datenmodell verfügen, das die Baumstruktur beschreibt, und Sie müssen nur daran erinnern, welchen Knoten in der Baumstruktur Sie gerade anzeigen. Wenn Sie den Benutzer auch zurück unterstützen möchten (indem Sie die Schaltfläche ZURÜCK verwenden), können Sie einen eigenen Stapel erstellen (nicht einen Stapel von Aktivitäten, sondern nur einen Stapel von Baumknotenreferenzen), anhand dessen Sie bestimmen können, welcher Knoten des Baum von dem aktuellen Knoten zurück zu gehen. Dies ist ein einfaches Datenverwaltungsproblem und Ihre Architektur hat dies zu einem View Verwaltungsproblem gezwungen.

+0

Danke für Ihre Antwort, Sie sind absolut richtig. Ich werde eine andere Architektur in der endgültigen App wählen. Obwohl ich immer noch interessiert bin, warum onActivityResult nur einmal in der Sequenz aufgerufen wird. – Johe