Ich weiß, dass Activities
sie einen einzelnen Bildschirm meiner Anwendung darstellen sollen, während Fragments
sie als wiederverwendbare UI-Layouts mit darin eingebetteter Logik konzipiert sind.
Bis vor kurzem habe ich eine Anwendung entwickelt, die besagt, dass sie entwickelt werden sollte. Ich habe ein erstellt Activity
, um einen Bildschirm meiner Anwendung darzustellen, und Fragmente für ViewPager
oder verwendet Google Maps
. Ich habe selten eine ListFragment
oder andere Benutzeroberfläche erstellt, die mehrmals wiederverwendet werden kann.
Kürzlich bin ich auf ein Projekt gestoßen, das nur 2 enthält, Activities
eines ist ein SettingsActivity
und das andere ist das MainActivity
. Das Layout der MainActivity
ist mit vielen versteckten Vollbild-UI-Fragmenten gefüllt und nur eines wird angezeigt. In der Activity
Logik gibt es viele FragmentTransitions
zwischen den verschiedenen Bildschirmen der Anwendung.
Was mir an diesem Ansatz gefallen hat, ist, dass die Anwendung, da sie eine verwendet ActionBar
, intakt bleibt und sich nicht mit der Bildschirmwechselanimation bewegt, was beim Activity
Umschalten der Fall ist . Dies verleiht diesen Bildschirmübergängen ein flüssigeres Gefühl.
Ich denke, ich bitte Sie, Ihre aktuelle Entwicklungsweise zu diesem Thema mitzuteilen. Ich weiß, dass es auf den ersten Blick wie eine meinungsbasierte Frage aussehen könnte, aber ich betrachte es als eine Frage zu Android-Design und -Architektur ... Nicht wirklich eine Meinungsbasierte.
UPDATE (01.05.2014): Nach dieser Präsentation von Eric Burke von Square (was ich sagen muss, ist eine großartige Präsentation mit vielen nützlichen Tools für Android-Entwickler. Und ich bin in keiner Weise mit Square verwandt).
http://www.infoq.com/presentations/Android-Design/
Aus meiner persönlichen Erfahrung in den letzten Monaten habe ich herausgefunden, dass der beste Weg, meine Anwendungen zu erstellen, darin besteht, Gruppen von Fragmenten zu erstellen, die einen Fluss in der Anwendung darstellen und alle diese Fragmente in einem präsentieren Activity
. Sie haben also im Grunde die gleiche Activities
Anzahl von Flows in Ihrer Anwendung wie die Anzahl der Flows. Auf diese Weise bleibt die Aktionsleiste auf allen Bildschirmen des Flusses intakt, wird jedoch beim Ändern eines Flusses neu erstellt, was sehr sinnvoll ist. Wie Eric Burke feststellt und wie ich auch festgestellt habe, ist die Philosophie, so wenig Activities
wie möglich zu verwenden, nicht für alle Situationen anwendbar, da sie die von ihm als "Gott" bezeichnete Aktivität durcheinander bringt.
Antworten:
Experten werden Ihnen sagen: "Wenn ich die Benutzeroberfläche sehe, weiß ich, ob ich ein
Activity
oder ein verwenden sollFragment
". Am Anfang wird dies keinen Sinn haben, aber mit der Zeit werden Sie tatsächlich erkennen können, ob Sie es brauchenFragment
oder nicht.Es gibt eine gute Praxis, die ich für mich sehr hilfreich fand. Es kam mir in den Sinn, als ich versuchte, meiner Tochter etwas zu erklären.
Stellen Sie sich nämlich eine Box vor, die einen Bildschirm darstellt. Können Sie einen anderen Bildschirm in dieses Feld laden? Wenn Sie eine neue Box verwenden, müssen Sie mehrere Elemente aus der ersten Box kopieren? Wenn die Antwort Ja lautet, sollten Sie verwenden
Fragments
, da der StammActivity
alle duplizierten Elemente enthalten kann, um Zeit beim Erstellen zu sparen, und Sie einfach Teile der Box ersetzen können.Vergessen Sie aber nicht, dass Sie immer einen Kastenbehälter (
Activity
) benötigen, sonst werden Ihre Teile verteilt. Also eine Box mit Teilen drinnen.Achten Sie darauf, die Box nicht zu missbrauchen. Android UX-Experten raten (Sie finden sie auf YouTube), wann wir explizit eine andere laden sollten
Activity
, anstatt eine zu verwendenFragment
(wie wenn wir uns mit der Navigationsleiste befassen, die Kategorien hat). Sobald Sie sich wohl fühlenFragments
, können Sie alle ihre Videos ansehen. Noch mehr sind sie Pflichtmaterial.Können Sie sich jetzt Ihre Benutzeroberfläche ansehen und herausfinden, ob Sie eine
Activity
oder eine benötigenFragment
? Hast du eine neue Perspektive bekommen? Ich denke du hast es getan.quelle
Meine Philosophie lautet:
Erstellen Sie eine Aktivität nur, wenn dies unbedingt erforderlich ist. Mit dem Backstack, der für das Festschreiben einer Reihe von Fragmenttransaktionen zur Verfügung gestellt wird, versuche ich, so wenig Aktivitäten wie möglich in meiner App zu erstellen. Außerdem ist die Kommunikation zwischen verschiedenen Fragmenten viel einfacher als das Hin- und Herschicken von Daten zwischen Aktivitäten.
Aktivitätsübergänge sind teuer, oder? Zumindest glaube ich das - da die alte Aktivität zerstört / angehalten / gestoppt, auf den Stapel geschoben und dann die neue Aktivität erstellt / gestartet / fortgesetzt werden muss.
Es ist nur meine Philosophie, seit Fragmente eingeführt wurden.
quelle
onActivityResult()
ist es sicherer und einfacher als die Rückrufe von Fragmenten.Nun, laut Googles Vorträgen (vielleicht hier , ich erinnere mich nicht) sollten Sie in Betracht ziehen, Fragmente zu verwenden, wann immer dies möglich ist, da dies die Wartung und Kontrolle Ihres Codes erleichtert.
Ich denke jedoch, dass es in einigen Fällen zu komplex werden kann, da die Aktivität, die die Fragmente hostet, zwischen ihnen navigieren / kommunizieren muss.
Ich denke, Sie sollten selbst entscheiden, was für Sie am besten ist. Es ist normalerweise nicht so schwer, eine Aktivität in ein Fragment umzuwandeln und umgekehrt.
Ich habe einen Beitrag über diese dillema erstellt hier , wenn Sie etwas weiter lesen möchten.
quelle
Warum ich in ALLEN FÄLLEN Fragment gegenüber Aktivität bevorzuge.
Aktivität ist teuer. In Fragment werden Ansichten und Eigenschaftszustände getrennt. Wenn sich ein Fragment befindet
backstack
, werden seine Ansichten zerstört. Sie können also viel mehr Fragmente als Aktivität stapeln.Backstack
Manipulation. MitFragmentManager
ist es einfach, alle Fragmente zu löschen, mehr einzufügen als auf Fragmenten und etcs. Aber für Activity wird es ein Albtraum sein, diese Dinge zu manipulieren.Ein viel vorhersehbarer Lebenszyklus . Solange die Host-Aktivität nicht recycelt wird. Die Fragmente im Backstack werden nicht recycelt. Es ist also möglich, ein
FragmentManager::getFragments()
bestimmtes Fragment zu finden (nicht empfohlen).quelle
Seit Jetpack ist die Single-Activity-App die bevorzugte Architektur. Besonders nützlich mit der Navigationsarchitekturkomponente .
Quelle
quelle
Meiner Meinung nach ist es nicht wirklich relevant. Der zu berücksichtigende Schlüsselfaktor ist
Fragmente werden hauptsächlich zum Erstellen von Mehrbereichsaktivitäten verwendet, wodurch sie sich perfekt für auf Tablets / Telefone reagierende Apps eignen.
quelle
Vergessen Sie nicht, dass eine Aktivität der Block / die Komponente einer Anwendung ist, die über Intent freigegeben und gestartet werden kann! Daher sollte jede Aktivität in Ihrer Anwendung nur eine Art von Aufgabe lösen. Wenn Sie nur eine Aufgabe in Ihrer Anwendung haben, benötigen Sie meiner Meinung nach nur eine Aktivität und bei Bedarf viele Fragmente. Natürlich können Sie Fragmente in zukünftigen Aktivitäten wiederverwenden, die andere Aufgaben lösen. Dieser Ansatz wird eine klare und logische Aufgabentrennung sein. Und Sie müssen nicht eine Aktivität mit unterschiedlichen Intent-Filterparametern für unterschiedliche Sätze von Fragmenten verwalten. Sie definieren Aufgaben in der Entwurfsphase des Entwicklungsprozesses basierend auf den Anforderungen.
quelle
Es gibt mehr als Sie denken, Sie müssen sich daran erinnern, dass eine Aktivität, die gestartet wird, die aufrufende Aktivität nicht implizit zerstört. Natürlich können Sie es so einrichten, dass Ihr Benutzer auf eine Schaltfläche klickt, um zu einer Seite zu gelangen. Sie starten die Aktivität dieser Seite und zerstören die aktuelle Seite. Dies verursacht viel Overhead. Der beste Leitfaden, den ich Ihnen geben kann, ist:
** Starten Sie eine neue Aktivität nur, wenn es sinnvoll ist, die Hauptaktivität und diese gleichzeitig zu öffnen (denken Sie an mehrere Fenster).
Ein gutes Beispiel dafür, wann es sinnvoll ist, mehrere Aktivitäten durchzuführen, ist Google Drive. Die Hauptaktivität bietet einen Datei-Explorer. Wenn eine Datei geöffnet wird, wird eine neue Aktivität gestartet, um diese Datei anzuzeigen. Sie können auf die Schaltfläche "Letzte Apps" klicken, um zum Browser zurückzukehren, ohne das geöffnete Dokument zu schließen, und dann möglicherweise sogar ein anderes Dokument parallel zum ersten zu öffnen.
quelle
attach
/detach
Methoden gut gelöst .Was ich getan habe: Wenn möglich weniger Fragment verwenden. Leider ist es in fast allen Fällen möglich. Am Ende habe ich viele Fragmente und ein paar Aktivitäten. Einige Nachteile, die ich erkannt habe:
ActionBar
& Menü: Wenn 2 Fragmente unterschiedliche Titel und Menüs haben,ist dies schwer zu handhaben. Beispiel: Wenn Sie ein neues Fragment hinzufügen, können Sie den Titel der Aktionsleiste ändern. Wenn Sie ihn jedoch öffnen, können Sie
backstack
den alten Titel nicht wiederherstellen. Möglicherweise benötigen Sie in diesem Fragment in jedem Fragment eine Symbolleiste, aber glauben Sie mir, das wird Sie mehr Zeit verbringen.startForResult
, hat Aktivität, Fragment aber nicht.Meine Lösung hierfür ist die Verwendung einer Aktivität, um ein Fragment darin zu verpacken . Wir haben also eine separate Aktionsleiste, ein Menü
startActivityForResult
, eine Animation, ...quelle
getSupportFragmentManager().addOnBackStackChangedListener
diese Option, um einen Listener hinzuzufügen. Holen Sie sich das aktuelle Fragment in diesen Listener und setzen Sie dann Titel und so.Der einzige große Vorteil einer
fragment
Überaktivität besteht darin, dass der für Fragmente verwendete Code für verschiedene Aktivitäten verwendet werden kann. Daher bietet er die Wiederverwendbarkeit von Code in der Anwendungsentwicklung.quelle
eine Aktivität pro Anwendung verwenden Basis für bereitzustellen
fragment
Verwendungfragment
für Bildschirm,fragments
ist lite Gewicht im Vergleich zuactivites
Fragmenten sind wieder verwendbar Fragmente werden besser geeignet für die Anwendung , die sowohl Telefon & Tablette unterstützenquelle
Sie können eine davon verwenden.
Grundsätzlich müssen Sie bewerten, welches für Ihre App am besten geeignet ist. Überlegen Sie, wie Sie den Geschäftsablauf verwalten und wie Sie Dateneinstellungen speichern / verwalten.
Überlegen Sie, wie Fragmente Mülldaten speichern. Wenn Sie das Fragment implementieren, müssen Sie einen Aktivitätsstamm mit Fragmenten füllen. Wenn Sie also versuchen, viele Aktivitäten mit zu vielen Fragmenten zu implementieren, müssen Sie die Leistung Ihrer App berücksichtigen, da Sie zwei Kontextlebenszyklen manipulieren (grob gesprochen), und sich an die Komplexität erinnern.
Denken Sie daran: Soll ich Fragmente verwenden? Warum sollte ich nicht?
Grüße.
quelle
Ich benutze Fragmente für eine bessere Benutzererfahrung. Wenn Sie beispielsweise eine Schaltfläche haben und einen Webservice ausführen möchten, wenn Sie darauf klicken, füge ich der übergeordneten Aktivität ein Fragment hinzu.
Auf diese Weise muss der Benutzer keine andere Aktivität ausführen.
Und zweitens bevorzuge ich Fragmente, weil man sie während der Rotation leicht handhaben kann.
quelle
Es kommt darauf an, was Sie wirklich bauen wollen. Zum Beispiel
navigation drawer
verwendet das Fragmente. Tabs werden ebenfalls verwendetfragments
. Eine andere gute Implementierung ist, wo Sie eine habenlistview
. Wenn Sie das Telefon drehen und auf eine Zeile klicken, wird die Aktivität in der verbleibenden Hälfte des Bildschirms angezeigt. Persönlich benutze ichfragments
undfragment dialogs
, da es professioneller ist. Außerdem lassen sie sich leichter drehen.quelle