it-swarm.com.de

Dilemma: Wann werden Fragmente gegen Aktivitäten eingesetzt?

Ich weiß, dass Activities einen einzelnen Bildschirm meiner Anwendung darstellen soll, während Fragments wiederverwendbare UI-Layouts mit eingebetteter Logik sind.

Bis vor kurzem habe ich eine Anwendung entwickelt, die besagt, dass sie entwickelt werden sollte. Ich habe ein Activity erstellt, um einen Bildschirm meiner Anwendung darzustellen, und habe Fragmente für ViewPager oder Google Maps verwendet. Ich habe selten eine ListFragment oder eine andere Benutzeroberfläche erstellt, die mehrmals wiederverwendet werden kann.

Vor kurzem bin ich auf ein Projekt gestoßen, das nur 2 Activities enthält. Eines ist ein SettingsActivity und das andere ist das MainActivity. Das Layout von MainActivity ist mit vielen versteckten Fragmenten der Vollbild-Benutzeroberfläche 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 ein ActionBar verwendet, intakt bleibt und sich nicht mit der Animation der Bildschirmumschaltung bewegt, was beim Activity -Umschalten der Fall ist. Dies verleiht diesen Bildschirmübergängen ein flüssigeres Gefühl.

Ich schätze, ich bitte Sie, Ihre aktuelle Entwicklungsweise zu diesem Thema mitzuteilen. Ich weiß, dass es auf den ersten Blick wie eine meinungsbasierte Frage aussieht, aber ich sehe es als Android Design- und Architekturfrage ... Nicht wirklich eine meinungsbasierte.

UPDATE (01.05.2014): Im Anschluss an diesen Vortrag von Eric Burke aus Square (was ich zu sagen habe, ist eine großartige Präsentation mit vielen nützlichen Tools für Android Entwickler. Und ich bin es nicht in irgendeiner 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 zum Erstellen meiner Anwendungen darin besteht, Gruppen von Fragmenten zu erstellen, die einen Fluss darstellen in der Anwendung und präsentieren Sie alle diese Fragmente in einem Activity. Sie haben also im Grunde die gleiche Anzahl von Activities in Ihrer Anwendung wie die Anzahl der Flows. Auf diese Weise bleibt die Aktionsleiste auf allen Bildschirmen des Flusses erhalten, wird jedoch neu erstellt, wenn ein Fluss geändert wird, der sehr sinnvoll ist. Wie Eric Burke feststellt und wie ich auch zu der Erkenntnis gekommen bin, ist die Philosophie, so wenig Activities wie möglich zu verwenden, nicht für alle Situationen anwendbar, da sie ein Durcheinander in dem erzeugt, was er die "Gott" -Aktivität nennt.

750
Emil Adz

Experten werden Ihnen sagen: "Wenn ich die Benutzeroberfläche sehe, werde ich wissen, ob ich ein Activity oder ein Fragment verwenden soll." Am Anfang wird dies keinen Sinn haben, aber mit der Zeit werden Sie tatsächlich feststellen können, ob Sie Fragment benötigen oder nicht.

Es gibt eine gute Praxis, die ich für mich als sehr hilfreich empfunden habe. Es ist mir eingefallen, als ich meiner Tochter etwas erklären wollte.

Stellen Sie sich nämlich eine Box vor, die einen Bildschirm darstellt. Können Sie einen anderen Bildschirm in diese Box laden? Wenn Sie eine neue Box verwenden, müssen Sie dann mehrere Artikel aus der ersten Box kopieren? Wenn die Antwort Ja lautet, sollten Sie Fragments verwenden, da der Stamm Activity alle duplizierten Elemente enthalten kann, um Zeit beim Erstellen zu sparen, und Sie können einfach Teile der Box ersetzen.

Aber nicht vergessen dass Sie immer einen Kartoncontainer benötigen (Activity) oder Ihre Teile werden verteilt. Also eine Kiste mit Teilen drin.

Achten Sie darauf, die Box nicht zu missbrauchen. Android UX-Experten raten (Sie finden sie auf YouTube), wann wir explizit ein anderes Activity laden sollten, anstatt ein Fragment zu verwenden (wie beim Umgang mit der Navigationsleiste, die es gibt) Kategorien). Sobald Sie sich mit Fragments vertraut gemacht haben, 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 ein Activity oder ein Fragment benötigen? Hast du eine neue Perspektive bekommen? Ich denke du hast es getan.

256
sandalone

Meine Philosophie lautet:

Erstellen Sie eine Aktivität nur, wenn dies unbedingt erforderlich ist. Mit dem für das Festschreiben mehrerer Fragmenttransaktionen verfügbaren Backstack versuche ich, so wenig Aktivitäten wie möglich in meiner App zu erstellen. Darüber hinaus 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.

121

Nun, laut den Vorlesungen von Google (vielleicht hier , ich erinnere mich nicht), sollten Sie in Betracht ziehen, Fragmente zu verwenden, wann immer dies möglich ist Dies erleichtert die Wartung und Kontrolle Ihres Codes.

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 dieses Dillema erstellt hier , wenn Sie etwas weiter lesen möchten.

57

Warum ich Fragmente in ALLEN FÄLLEN der Aktivität vorziehe.

  • Aktivität ist teuer. In Fragment werden Ansichten und Eigenschaftsstatus getrennt. Wenn sich ein Fragment in backstack befindet, werden seine Ansichten zerstört. Sie können also viel mehr Fragmente als Aktivität stapeln.

  • Backstack Manipulation. Mit FragmentManager ist es einfach, alle Fragmente zu löschen und mehr als bei Fragmenten und Etcs einzufügen. 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 Stapel werden nicht recycelt. So ist es möglich, FragmentManager::getFragments() zu verwenden, um ein bestimmtes Fragment zu finden (nicht empfohlen).

27
Qylin

Da Jetpack , Single-Activity-App die bevorzugte Architektur ist. Nützlich vor allem mit der Navigation Architecture Component .

Quelle

13
Francis

Meiner Meinung nach ist es nicht wirklich relevant. Der zu berücksichtigende Schlüsselfaktor ist

  1. wie oft werden Sie Teile der Benutzeroberfläche wiederverwenden (z. B. Menüs)?
  2. ist die App auch für Tablets?

Fragmente werden hauptsächlich zum Erstellen von Multipane-Aktivitäten verwendet, wodurch sie sich perfekt für auf Tablets und Telefone reagierende Apps eignen.

12
Isaac Urbina

Vergessen Sie nicht, dass eine Aktivität der Block/die Komponente einer Anwendung ist, der/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, brauchen Sie meines Erachtens 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 verschiedene Fragmentsätze verwalten. Sie definieren Aufgaben in der Entwurfsphase des Entwicklungsprozesses basierend auf den Anforderungen.

9
guest

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. Dies verursacht viel Overhead. Die beste Anleitung, die ich Ihnen geben kann, ist:

** Starten Sie eine neue Aktivität nur, wenn es sinnvoll ist, die Hauptaktivität und diese gleichzeitig geöffnet zu haben (denken Sie an mehrere Fenster).

Ein gutes Beispiel dafür, wann es Sinn macht, 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 öffnen.

8
TheHebrewHammer

Was ich getan habe: Wenn möglich weniger Fragmente verwenden. Leider ist es in fast allen Fällen möglich. Also habe ich am Ende viele Fragmente und ein bisschen Arbeit. Einige Nachteile, die ich erkannt habe:

  • ActionBar & Menu: Wenn 2 Fragment unterschiedliche Titel hat, Menü, das
    wird schwer zu handhaben sein. Beispiel: Wenn Sie ein neues Fragment hinzufügen, können Sie den Titel der Aktionsleiste ändern, aber wenn Sie es aus backstack einfügen, können Sie den alten Titel nicht wiederherstellen. In diesem Fall benötigen Sie möglicherweise in jedem Fragment eine Symbolleiste, aber glauben Sie mir, damit verbringen Sie mehr Zeit.
  • Wenn wir startForResult brauchen, hat Aktivität, Fragment jedoch nicht.
  • Standardmäßig ist keine Übergangsanimation vorhanden

Meine Lösung hierfür ist die Verwendung einer Aktivität zum mbrechen eines Fragments im Inneren. So haben wir separate Aktionsleiste, Menü, startActivityForResult, Animation, ...

7
I Love Coding

Der einzige große Vorteil von fragment gegenüber Aktivitäten besteht darin, dass der Code, der für Fragmente verwendet wird, für verschiedene Aktivitäten verwendet werden kann. Dies bietet also Wiederverwendbarkeit von Code in der Anwendungsentwicklung.

4
Sanchit Bhasin

verwenden Sie eine Aktivität pro Anwendung, um die Basis für fragment bereitzustellen. Verwenden Sie fragment für den Bildschirm. fragments sind lite weight as Im Vergleich zu activites sind Fragmente wiederverwendbar Fragmente besser geeignet Für Apps, die sowohl Handys als auch Tablets unterstützen

2
varg

Sie können eine davon verwenden.
Grundsätzlich müssen Sie bewerten, welches für Ihre App das beste ist. Überlegen Sie, wie Sie den Geschäftsfluss 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 den Lebenszyklus von zwei Kontexten manipulieren (grob gesprochen) und sich an die Komplexität erinnern.

Denken Sie daran: Soll ich Fragmente verwenden? Warum sollte ich nicht

grüße.

2
Franklin Hirata

Ich benutze Fragmente für eine bessere Benutzererfahrung. Wenn Sie beispielsweise einen Button haben und einen Webservice ausführen möchten, wenn Sie darauf klicken, füge ich der übergeordneten Aktivität ein Fragment hinzu.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

Auf diese Weise muss sich der Benutzer nicht in einer anderen Aktivität bewegen.

Und zweitens bevorzuge ich Fragmente, weil Sie sie beim Drehen leicht handhaben können.

1
Theo

Es kommt darauf an, was Sie wirklich bauen wollen. Beispielsweise verwendet der navigation drawer Fragmente. Tabs verwenden ebenfalls fragments. Eine andere gute Implementierung ist, wo Sie ein listview haben. 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 ich fragments und fragment dialogs, da es professioneller ist. Außerdem lassen sie sich leichter drehen.

1
Theo