Wie wird der Listener in benutzerdefinierten Dialog beibehalten, der aus dem Fragment geöffnet wurde?

8

Ich bin in eine Straßensperre geraten. Ich habe ein Szenario sehr ähnlich dem unter DialogFragment - Behalten Listener nach Bildschirmdrehung

Die vorgeschlagene Lösung funktioniert gut für den Autor, weil sein Dialog von einer Aktivität aufgerufen wird. Mein Fall ist genau derselbe, aber mein benutzerdefinierter Dialog wird von einem Fragment anstatt von einer Aktivität aufgerufen. (IE-Aktivität- & gt; Fragment- & gt; Dialog)

Ich habe dieselbe Lösung implementiert (indem ich den Listener in onResume vom aufrufenden Fragment gesetzt habe), aber in diesem Fall funktioniert es nicht.

Was passiert, ist, dass Android den Dialog und das Fragment zerstört, wenn der Bildschirm gedreht wird. Erstellt sie dann in dieser Reihenfolge neu. Wenn also mein onCreateDialog in meinem benutzerdefinierten Dialog aufgerufen wird, muss das enthaltende Fragment noch neu erstellt werden, so dass der Listener null für positive und negative Schaltflächen hat.

Kennt jemand einen Weg um dies?

Ich kann Code schreiben, wenn irgendjemand denkt, dass es notwendig sein würde, aber es ist ziemlich genau der selbe wie der Code auf dem verbundenen Thread.

AKTUALISIERT MIT CODE:

%Vor%     
user2229491 25.09.2013, 23:06
quelle

2 Antworten

3

Ich habe alle Optionen auf den besprochenen Links durchgelaufen und keine der Lösungen funktionierte für mich. Ich habe auch eine Reihe von zusätzlichen Optionen nach dem weiteren googlen wie get / setTargetFragment und FragmentManager.put / getFragment versucht. Diese funktionierten auch nicht für mich. Dann schaute ich noch einmal:

Ссылка

Wo sie ausdrücklich sagen "Zwei Fragmente sollten nie direkt kommunizieren". Ich denke, das ist einer der Fälle, in denen das wirklich bewiesen ist.

Ich habe den vorgeschlagenen Callback-Mechanismus umgesetzt und bin damit fertig geworden:

In DialogFragment:

%Vor%

Beim Hosting Aktivität:

%Vor%

In Fragment, das den FragmentDialog abfeuert:

%Vor%

Das funktioniert perfekt, wenn es geöffnet wird und die Orientierungsänderung und Bearbeitung abgeschlossen ist, löst es tatsächlich die ultimative Funktion aus, die ich im aufrufenden Fragment ausführen muss, anstatt entweder abzustürzen oder nichts zu tun (Null-Listener).

    
user2229491 26.09.2013, 23:54
quelle
0

Wäre es eine Katastrophe, wenn Sie Ihre Aktivitäten melden und den Dialog erstellen würden?

Ich habe gerade meinen Code überprüft, um zu sehen, was ich mache, da ich dieses Problem noch nicht habe. Ich betrachte es in etwa so:

%Vor%

Bei dieser Konstruktion verwendet die Aktivität das Fragment also ausschließlich zum Anzeigen der Karte, kann es jedoch sowohl für die Zwecke von Richtungen als auch für Punkte von Interesse verwenden, je nachdem, welches Modul aufgerufen wird.

Wenn das Modul nun auf ein Problem stößt oder Benutzerinteraktion benötigt, meldet es sich an MyActivity zurück, die dann beispielsweise ein DialogFragment anzeigt.

Ich möchte eine bessere Antwort geben, da ich nicht sehe, warum Sie nicht in der Lage sein sollten, ein DialogFragment innerhalb eines anderen Fragments aufzurufen und ein schönes Verhalten zu erwarten.

Nur für den Fall, haben Sie setRetainInstance (true) auf Ihr Fragment gesetzt?

Bearbeiten:

Ok, also habe ich gerade Ihren neuen Code überprüft, hier ist meine neue Idee:

Erweitern Sie die Argumente Ihres Dialogs, um einen Kontext zu verwenden, damit Sie ihn wie folgt aufrufen können:

%Vor%

Als nächstes benutze den hinzugefügten Kontext anstelle von getActivity () in deinem Dialog:

%Vor%

Ich vermute (nicht sicher), dass SherlockFragment als eine Instanz von Activity gilt. Wenn Sie getActivity () in Ihrem Dialog aufrufen, ist es an Ihr Fragment gebunden.

    
cYrixmorten 25.09.2013 23:37
quelle