Activity-Und Fragment-Interaktion
Ich habe eine Activity
mit mehreren Fragment
s. Ich will zeigen, eine DialogFragment
oder öffnen Sie eine andere Fragment
von einem der Fragment
s. Ich weiß, dass ein Activity
sollte sein, die eine Aufgabe mit öffnen Fragment
s also statt dessen habe ich versucht, ein paar Dinge.
ERSTEN
Ich habe versucht, zu verwenden getActivity()
und warf es, so kann ich eine Methode aufrufen in der Activity
zu zeigen Fragment
aber das schafft Sie eine Abhängigkeit in der Fragment
mit der Activity
und ich möchte vermeiden, das hinzufügen einer Abhängigkeit, wenn möglich.
ZWEITEN
Danach habe ich versucht, einen listener zu Benachrichtigen, die Activity
es sollte zeigen, ein Fragment
. Also habe ich eine Klasse angelegt, in der Activity
zu implementieren die listener-Schnittstelle. Aber ich hatte Probleme, weil ich zu verwenden habe New MyActivity().new Listener();
und es würde werfen ein Exception
als ich versuchte zu verwenden getSupportFragmentManager()
da diese Instanz des Activity
ist nicht initialisiert.
DRITTEN
Ich habe dann versucht, die Activity
implementieren, die den Zuhörer direkt, die funktioniert, weil dann bin ich nur bei der Erstellung einer Abhängigkeit mit dem Hörer und nicht die Aktivität. Aber jetzt bin ich immer zu dem Punkt, wo meine Activity
wird die Implementierung von 2 - 4 verschiedenen Schnittstellen, das macht mich zögerlich, weil es stark reduzieren zusammenhalt.
So, wie ich versucht habe, ich scheine zu sein, läuft in eine Mauer und die Schaffung von Abhängigkeiten, ich bin mir nicht sicher, ich brauche, zu erstellen. Bin ich geschraubt und gehen mit einer dieser Optionen? Wenn ja, welche option am besten wäre? Jede Hilfe oder Anregungen sind wir sehr dankbar.
- Es gibt viele Möglichkeiten, es zu tun, ich bevorzuge, die Dinge so entkoppelt wie möglich, und für dass ich wie ein event-bus. Siehe otto, zum Beispiel: square.github.io/otto. (Können Sie loszuwerden, alle die Schnittstelle/listener-cruft. Pass-Daten, tun Sie es mit starken Typen, die es tun, in einer klaren prägnant!)
- Es scheint vielversprechend. Werde ich haben, check it out. Danke für den Tipp.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich würde ich sagen, dass Fragmente sollte gedacht werden als wiederverwendbare und modular aufgebaute Komponenten. So, um diese re-usability, Fragmente sollten nicht wissen sehr viel über Ihre Eltern Aktivitäten. Aber im Gegenzug Aktivitäten wissen müssen über die Fragmente, die Sie halten.
So, die erste option sollte nie betrachtet meiner Meinung nach für das Beziehungswissen ein Grund, warum Sie erwähnt, was zu einer sehr stark gekoppelt code.
Über die zweite option, Fragmente delegieren kann jede Anwendung Durchfluss-oder UI-bezogene Entscheidungen (zeigt ein neues fragment, zu entscheiden, was zu tun ist, wenn ein fragment bestimmtes Ereignis ausgelöst wird, etc..) zu Ihrer übergeordneten Aktivitäten. Damit Ihre Zuhörer/callbacks sollte ein fragment spezifisch und so sollten Sie erklärt werden, in Fragmente. Und die Aktivitäten, halten diese Fragmente sollten diese Schnittstellen implementieren und zu entscheiden, was zu tun ist.
Also bei mir ist die Dritte option macht mehr Sinn. Ich glaube, dass die Aktivitäten sind besser lesbar in Bezug auf, was Sie halten und tun, auf bestimmte Rückrufe. Aber ja du hast Recht, Ihre Aktivität könnte sich zu einem Gott-Objekt.
Vielleicht können Sie prüfen, Square Otto Projekt, wenn Sie nicht wollen, um mehrere Schnittstellen implementieren. Es ist im Grunde ein eventbus.
Erstellung einer Schnittstelle
In Aktivität Klasse halten refrence von
ListenFromActivity
SchnittstelleÖffentliche Methode, um listener
Fügen Sie einige Triggerpunkt-Aktivität in der Klasse, hier habe ich Benutzerinteraktion
Nun in Fragment-Klasse
machen Sie Ihre fragment-Schnittstelle implementieren Klasse
Android studio werden Sie aufgefordert, den zu implementierenden Methode der Schnittstelle im fragment
Letzte Teil Teil listener-Instanz-Aktivität, wie dies in fragment
onCreate
MethodeGETAN!!. rufen Sie nun das fragment Methode von Aktivität.
Ich denke die zweite option ist auf der richtigen Spur.
In Ihrem fragment, definieren Sie die listener-Schnittstelle:
Haben die Aktivität, die das interface implementieren:
Übergeben, so dass der Zuhörer das fragment. Ich mag es zu tun in der Fragment-Konstruktor übergeben, aber das funktioniert nur, wenn es Ihnen gelingt, Ihre Fragmente vollständig von selbst. Sie können eine
setListener
Methode, um Ihre fragment statt.setListener
Ansatz: wenn das Fragment zerstört und neu erstellt, die vom Betriebssystem (mit dem standardmäßigen leeren Konstruktor), der Verweis auf den listener, die verloren gehen würden. Der beste Weg, dies zu erreichen ist, code in dieonAttach
Methode, um hook up das fragment übergeordnete Aktivität der Zuhörer, die Prüfung zur Laufzeit, dass Sie die benötigte Schnittstelle unterstützt. Siehe developer.android.com/guide/components/fragments.html : 'Erzeugen von Event-Callbacks, um die Aktivität'.Werden Sie brauchen, um passieren Ihre Daten von Fragment X bis zu deiner FragmentActivity, die übergeben wird, diese Daten auf Ihrem Fragment Y. Sie tun, dass durch eine Schnittstelle definiert in Ihrem fragment-Klasse und instanziieren Sie einen Rückruf, der definiert ist in der onAttach().
Weitere Informationen, wie Sie dies hier tun
Kommunikation Mit anderen Fragmenten
Schnelle Beispiel-Fragment A und Fragment B. Fragment A ist eine Liste fragment, und immer, wenn ein Element ausgewählt ist, es wird sich ändern, was angezeigt wird, ist in Fragment B. Einfach genug, richtig?
Zunächst definieren Fragment A als solche.
Und hier ist Fragment B
Und hier ist mein FragmentActivity, dass Sie regieren beide
Vermutlich haben Sie so etwas wie dies bereits, nun, hier ist, wie würden Sie ändern, FragmentA(die Liste fragment, das wir brauchen, um einige Daten aus).
Die wichtigste überlegung ist hier, dass Ihre Eltern-Aktivität, die dieses interface implementiert, oder sonst erhalten Sie eine Ausnahme. Wenn erfolgreich umgesetzt, jedesmal, wenn ein Element in Ihrer Liste-fragment ausgewählt ist, werden Ihre Aktivitäten informiert werden es die position. Natürlich könnten Sie ändern Ihre Schnittstelle mit einer beliebigen Anzahl oder Typ der Parameter, in diesem Beispiel sind wir nur auf der Durchreise in unsere integer position. Hoffe, das klärt ein wenig Mensch, viel Glück.
Haben Sie versucht, so etwas wie dieses (aus der Fragment):
Lassen Sie mich wissen, cheers.
Auf ein maximum in der losen Kopplung können Sie einen event-bus, wie OTTO von Quadrat-oder EventBus von GreenRobot.
Ihre Fragmente können Ereignisse auslösen, die behandelt werden, durch Ihre Aktivität und Umgekehrt. Die kühle Sache über dieses ist, dass die Komponenten (Aktivitäten, Fragmente) gar nichts über einander, und Sie brauchen nicht zu erklären, keine Schnittstellen oder Rückrufe.
Ich nutze es in all meinen Projekten und es ist robust und hat einen geringen bis keinen Einfluss auf die Leistung (unter normalen Bedingungen).
Nur Folgen Sie der Dokumentation:
Fragment
:Activity
: