Android Verwalten von Fragmenten von Aktivitäten elegant

8

Beschreibung dessen, was ich erreichen möchte: Ich habe eine App, die eine FragmentActivity mit einem LinearLayout als Container für die Fragmente verwendet. Ich klicke auf verschiedene Schaltflächen auf der FragmentActivity-Benutzeroberfläche und füge Fragmente zu dem Container in der FragmentActivity hinzu und entferne sie. Zusätzlich zu den Schaltflächen auf der FragmentCtivity-Benutzeroberfläche verfügt jedes Fragment über Schaltflächen, auf die geklickt werden kann. Dadurch wird das aktuelle Fragment entfernt und an dessen Stelle ein anderes Fragment eingefügt.

Die Android-Methode, Dinge so zu tun, wie ich es verstehe: Ich habe gelesen, wie man das macht, und so wie ich es verstehe, ist die "richtige" Art, Dinge zu tun, die FragmentActivity als eine Art Relaisstation zu verwenden und jedes Fragment Callbacks zur Fragment-Aktivität zu machen, um Ereignisse zu kommunizieren und damit umzugehen Sie.

Szenario: Nehmen wir an, dass die FragmentAktivität das Fragment A anzeigt und wenn der Benutzer auf eine Schaltfläche in Fragment A klickt, möchte ich die Anzeige von FragmentA stoppen und mit der Anzeige von FragmentB beginnen. Dazu habe ich eine Schnittstelle in FragmentA namens AListener erstellt. In der onAttach () - Methode von FragmentA verwende ich die vorgeschlagene Methode, um zu überprüfen, ob die FragmentActivity AListener implementiert. Wenn die Schaltfläche in FragmentA geklickt wird, verwende ich eine der Callback-Methoden von AListener, um das click-Ereignis an die FragmentActivity zu übermitteln. In der FragmentActivity erstelle ich eine Instanz von FragmentB und füge sie dem Container in FragmentActivity hinzu. Wenn dann ein Ereignis in FragmentB passiert, verwende ich das gleiche Schema, um das Ereignis an die FragmentAktivität zu übermitteln und etwas Interessantes zu tun.

Was ist das Problem? Für meine Anwendung habe ich dieses Schema gefunden, bei dem Fragmente zu der FragmentActivity zurückrufen und dann die Fragment-Aktivität ein neues Fragment erzeugen oder ein Vorwärts- und ein bestehendes Fragment sehr mühsam aufrufen. Ich habe viele Fragmente, die von der FragmentActivity angezeigt werden müssen, und deshalb implementiere ich eine Schnittstelle für jeden Typ von Fragment, der angezeigt werden muss (jedes Fragment ist unterschiedlich, so dass jedes seine eigene Schnittstelle hat). Dies führt zu Konflikten, wenn ich zwei Schnittstellen habe, die die gleichen Methodensignaturen haben, und ich bin gezwungen, eine der Methoden umzubenennen.

Wenn ich beispielsweise einen Listener mit der Methode onAttach () des Fragments an ein Fragment anhängen möchte, muss meine FragmentActivity die Schnittstelle implementieren. Ich habe mehrere Instanzen gefunden, in denen Callback-Methoden denselben Namen haben (oder ich bin gezwungen, sie als ähnlich zu bezeichnen, aber wegen einer Namensraum-Kollision anders). Eine Lösung hierfür wäre die Verwendung anonymer Klassen als Callbacks, anstatt dass die Fragment-Methode die Schnittstelle implementiert. Dies scheint gut genug zu funktionieren, geht aber gegen das, was die Android-Dokumentation zur Verwendung der onAttach () -Methode zum Einstellen des Listeners sagt.

Gibt es elegante Möglichkeiten, dieses Problem anzugehen? Es scheint mir der Kompromiss zu sein, dass Sie entweder die FragmentActivity zwingen, eine Schnittstelle für jedes Fragment zu implementieren, das Sie darin anzeigen möchten, und das Spaßiges Problem, wenn Sie nach Methodensignaturkollisionen Ausschau halten, oder Sie gehen gegen die Android-Dokumentation und verwenden anonyme Klassen, um die Rückrufe zu handhaben (nicht sicher über die Auswirkungen davon).

Ich bin ziemlich neu in Java und habe das Gefühl, hier könnte mir ein Konzept fehlen, das mein Problem lösen würde. Kann mir jemand genau sagen, wie ich dieses Problem elegant lösen kann?

    
neonDion 19.11.2013, 19:17
quelle

2 Antworten

3

Ein Mitarbeiter von mir hat eine elegante Lösung für dieses Problem gefunden.

Denken Sie daran, dass wir versuchen, Fragmenten einen Rückruf zur übergeordneten Aktivität zu ermöglichen, ohne dass die Aktivität die Schnittstelle implementiert. Außerdem müssen wir den Listener automatisch neu einstellen können, wenn die Aktivität zerstört und dann neu erstellt wird.

Aktivitäten verfügen über einen Lebenszyklus-Callback namens onAttachFragment (Fragmentfragment), der aufgerufen wird, wenn ein Fragment an die Aktivität angehängt wird. Wenn beispielsweise ein neues Fragment innerhalb der Aktivität erstellt wird, wird dieses aufgerufen. Es wird auch aufgerufen, wenn eine Aktivität, die zuvor zerstört wurde, neu erstellt wird. Sie können eine Schnittstelle oder eine anonyme Klasse verwenden, um einen Listener für das neue Fragment in onAttachFragment wie folgt festzulegen:

%Vor%

Mit dieser Technik können wir vermeiden, dass die Aktivität eine Schnittstelle für den Callback implementieren muss, und so vermeiden wir Namenskonflikte mit unseren Callback-Methoden. Wenn die Aktivität zerstört wird, wird der Listener nach der Wiederherstellung automatisch zurückgesetzt, so dass unsere Callbacks funktionieren.

Es gibt wahrscheinlich viele andere Möglichkeiten, dies zu tun, und ich würde gerne jemandes Kritik an dieser Technik und Vorschläge für andere Techniken hier zu finden.

    
neonDion 25.01.2014, 16:45
quelle
4

Ich verstehe dein Problem vollkommen, da ich es lange Zeit habe. Hier ist die Lösung, die ich gerade gefunden habe! Es kann einige Änderungen benötigen, die auf Ihrem Bedarf basieren, aber ich es funktioniert gut.

Um die Kommunikation der Veranstaltung in Ihrer App einfacher zu gestalten, nutzen Sie einen EventBus! Hier ist der berühmteste Ссылка Event-Bus ermöglicht es Ihnen, Ereignisse von überall her zu senden, ohne sich um die Implementierung von Schnittstellen, Broadcast-Empfängern, Threading usw. kümmern zu müssen.

Dann füge FragmentOrganizer zu deiner App hinzu. Es ist eine Basisklasse für alle deine Fragmentorganisatoren. Im Grunde brauchen Sie einen für jede Aktivität. Hier ist der Code

%Vor%

Nun müssen Sie Ihren Fragmentorganisator erstellen, der von FragmentOrganizer erbt und 3 erforderliche Methoden implementiert. hier das Beispiel

%Vor%

Und in deiner Aktivität musst du einfach nur deinen FragmentManager ins Schwitzen bringen und es der Magie überlassen!

%Vor%

Es scheint eine Menge Code zu sein, aber wie Sie den Großteil des in der FragmentOrganizer-Basisklasse gekapselten Codes sehen, funktioniert das Ganze so, dass Sie diese Datei nur von einem Projekt in ein anderes kopieren müssen.

Wie ich am Anfang gesagt habe, bin ich gerade auf diese Lösung gekommen, also ist sie vielleicht nicht perfekt. Ich plane, dieses in meinem nächsten Projekt zu verwenden, ich hoffe, dass Sie dazu tun. Und wenn du es wirklich schaffst, wenn du es teilst. viel Spaß

    
Reza 23.07.2015 15:38
quelle

Tags und Links