Warum Fragmente und wann Fragmente anstelle von Aktivitäten verwenden?

485

In Android API 11+ hat Google eine neue Klasse namens veröffentlicht Fragment.

In den Videos schlägt Google vor, wann immer möglich ( Link1 , Link2 ) Fragmente anstelle von Aktivitäten zu verwenden, aber sie haben nicht genau erklärt, warum.

Was ist der Zweck von Fragmenten und einige mögliche Verwendungen davon (abgesehen von einigen UI-Beispielen, die leicht durch einfache Ansichten / Layouts erreicht werden können)?

Meine Frage betrifft Fragmente:

  1. Was sind die Zwecke der Verwendung eines Fragments?
  2. Was sind die Vor- und Nachteile der Verwendung von Fragmenten im Vergleich zur Verwendung von Aktivitäten / Ansichten / Layouts?

Bonusfragen:

  1. Können Sie einige wirklich interessante Verwendungszwecke für Fragmente angeben? Dinge, die Google in seinen Videos nicht erwähnt hat?
  2. Was ist der beste Weg, um zwischen Fragmenten und den Aktivitäten, die sie enthalten, zu kommunizieren?
  3. Was sind die wichtigsten Dinge, an die Sie denken sollten, wenn Sie Fragmente verwenden? Irgendwelche Tipps und Warnungen aus Ihrer Erfahrung?
Android-Entwickler
quelle

Antworten:

282

# 1 & # 2 Was sind die Zwecke der Verwendung eines Fragments und welche Vor- und Nachteile hat die Verwendung von Fragmenten im Vergleich zur Verwendung von Aktivitäten / Ansichten / Layouts?

Fragmente sind die Lösung von Android zur Erstellung wiederverwendbarer Benutzeroberflächen. Sie können einige der gleichen Dinge mithilfe von Aktivitäten und Layouts erreichen (z. B. mithilfe von Includes). Jedoch; Fragmente werden von HoneyComb und höher mit der Android-API verbunden. Lassen Sie mich näher darauf eingehen.

  • Die ActionBar. Wenn Sie möchten, dass Registerkarten dort oben in Ihrer App navigieren, sehen Sie schnell, dass die ActionBar.TabListenerBenutzeroberfläche Ihnen FragmentTransactionein Eingabeargument für die onTabSelectedMethode gibt. Sie könnten dies wahrscheinlich ignorieren und etwas anderes und cleveres tun, aber Sie würden gegen die API arbeiten, nicht damit.

  • Die FragmentManagerGriffe «zurück» für Sie auf sehr clevere Weise. Zurück bedeutet nicht zurück zur letzten Aktivität, wie bei regulären Aktivitäten. Es bedeutet zurück zum vorherigen Fragmentzustand.

  • Sie können das Cool ViewPagermit einem verwenden FragmentPagerAdapter, um Swipe-Schnittstellen zu erstellen. Der FragmentPagerAdapterCode ist viel sauberer als ein normaler Adapter und steuert die Instanziierung der einzelnen Fragmente.

  • Ihr Leben wird viel einfacher, wenn Sie Fragmente verwenden, wenn Sie versuchen, Anwendungen für Telefone und Tablets zu erstellen. Da die Fragmente so stark mit den Honeycomb + -APIs verknüpft sind, sollten Sie sie auch auf Telefonen verwenden, um Code wiederzuverwenden. Hier bietet sich die Kompatibilitätsbibliothek an.

  • Sie könnten und sollten sogar Fragmente für Apps verwenden, die nur für Telefone bestimmt sind. Wenn Sie Portabilität im Auge haben. Ich verwende ActionBarSherlockund die Kompatibilitätsbibliotheken, um "ICS-aussehende" Apps zu erstellen, die bis zur Version 1.6 gleich aussehen. Sie erhalten die neuesten Funktionen wie die ActionBarmit Registerkarten, Überlauf, geteilter Aktionsleiste, Viewpager usw.

Bonus 2

Der beste Weg, um zwischen Fragmenten zu kommunizieren, sind Absichten. Wenn Sie etwas in einem Fragment drücken, rufen Sie normalerweise StartActivity()mit Daten darauf auf. Die Absicht wird an alle Fragmente der von Ihnen gestarteten Aktivität weitergegeben.

Glenn Bech
quelle
5
Zunächst einmal danke. Ich schätze Leute, die informative (aber kurze) Antworten geben und mir nicht nur einen Link zu einem Handbuch geben. Neben zusätzlichen Funktionen für die Arbeit an speziellen Klassen können Sie sich auch die Vor- und Nachteile der Arbeit mit Fragmenten vorstellen ?
Android-Entwickler
4
Ich denke, Sie müssen direkter fragen. Ich habe oben nur vier Hauptvorteile gegeben.
Glenn Bech
2
ok, was ist mit den Nachteilen im Vergleich zu benutzerdefinierten Ansichten und Aktivitäten?
Android-Entwickler
2
Wie kommuniziert man zwischen Fragmenten mit Absichten? Müssen alle Fragmente "lebendig" sein (zur Aktivität hinzugefügt), damit sie miteinander kommunizieren können?
Android-Entwickler
55
Ein Fragment sollte niemals direkt mit einem anderen Fragment sprechen, sondern die übergeordnete Aktivität durchlaufen. Auf diese Weise erhalten Sie keinen Spaghetti-Code, sondern einfach zu verwaltenden Code.
Slott
70

Sie sind sich nicht sicher, auf welche Videos Sie sich beziehen, aber ich bezweifle, dass Sie Fragmente anstelle von Aktivitäten verwenden sollten, da diese nicht direkt austauschbar sind. Es gibt tatsächlich einen ziemlich detaillierten Eintrag im Dev Guide. Lesen Sie ihn für Details.

Kurz gesagt, Fragmente leben in Aktivitäten, und jede Aktivität kann viele Fragmente enthalten. Wie Aktivitäten haben sie einen bestimmten Lebenszyklus, im Gegensatz zu Aktivitäten sind sie keine Anwendungskomponenten der obersten Ebene. Zu den Vorteilen von Fragmenten gehören die Wiederverwendung von Code und die Modularität (z. B. die Verwendung derselben Listenansicht in vielen Aktivitäten), einschließlich der Möglichkeit, Schnittstellen mit mehreren Fenstern zu erstellen (meistens nützlich auf Tablets). Der Hauptnachteil ist (einige) zusätzliche Komplexität. Im Allgemeinen können Sie dasselbe mit (benutzerdefinierten) Ansichten auf nicht standardmäßige und weniger robuste Weise erreichen.

Nikolay Elenkov
quelle
1
aktualisierte Frage. Es hat jetzt Links zu den Videos von Google. auch danke für die erklärung, aber ich brauche noch klärung über meine frage.
Android-Entwickler
5
Lesen Sie den Dev Guide-Eintrag, er enthält mehr als genug Details. Es ist unwahrscheinlich, dass Sie eine Antwort auf "coole Verwendungen von Fragmenten" auf SO erhalten - Weg zu vage und es gibt keine einzige Antwort. Nummer 4 wird speziell im Entwicklerhandbuch
Nikolay Elenkov
1
Soweit ich weiß, erzeugt diese Methode eine Abhängigkeit davon, welche Aktivität welches Fragment enthalten kann. Bitte beantworten Sie auch die Hauptfragen (die ersten beiden).
Android-Entwickler
3
Vielen Dank an den Android-Entwickler für das Bestehen auf Antworten auf die grundlegende Frage. ATM Ich habe in der Fragment-Klasse nichts Nützliches über die Verwendung des XML-Tags "include" gesehen. Die Art von Dingen, die ich wertvoll finden würde, wäre die Möglichkeit, ein Layout anzugeben, das sich auf magische Weise in die beste Benutzererfahrung bei allen Auflösungen verwandeln würde. Soweit ich Ihnen sagen kann, müssen Sie dies im Code selbst tun. Ein weiterer potenzieller Wert wäre eine Möglichkeit, Code + Ressourcen in wiederverwendbare Komponenten zu bündeln, die in den wiederverwendbaren Apps nicht enthalten sind, aber wiederum nicht vorhanden zu sein scheinen. Ich möchte einen wirklich guten Grund.
Melinda Green
2
Ich fange an zu verstehen, wie Google die Verwendung von Fragmenten vorschlägt, aber ich stimme @NikolayElenkov ziemlich zu. Für mich scheint die Verwendung von Aktivitäten immer noch die robusteste und weniger komplexe Methode zu sein.
andrea.rinaldi
49

Ein Fragment ist ein Teil der Benutzeroberfläche oder des Verhaltens einer Anwendung, der in eine Aktivität eingefügt werden kann, um ein modulareres Aktivitätsdesign zu ermöglichen. Es wird nicht falsch sein, wenn wir sagen, dass ein Fragment eine Art Subaktivität ist.

Es folgen wichtige Punkte zu einem Fragment:

  1. Ein Fragment hat ein eigenes Layout und ein eigenes Verhalten mit eigenen Rückrufen für den Lebenszyklus.

  2. Sie können Fragmente in einer Aktivität hinzufügen oder entfernen, während die Aktivität ausgeführt wird.

  3. Sie können mehrere Fragmente in einer einzigen Aktivität kombinieren, um eine Benutzeroberfläche mit mehreren Fenstern zu erstellen.

  4. Ein Fragment kann in mehreren Aktivitäten verwendet werden.

  5. Der Fragmentlebenszyklus hängt eng mit dem Lebenszyklus seiner Wirtsaktivität zusammen.

  6. Wenn die Aktivität angehalten wird, werden auch alle in der Aktivität verfügbaren Fragmente gestoppt.

  7. Ein Fragment kann ein Verhalten implementieren, das keine Benutzeroberflächenkomponente enthält.

  8. Fragmente wurden der Android-API in Android 3 (Honeycomb) mit API-Version 11 hinzugefügt .

Weitere Informationen finden Sie auf der offiziellen Website Fragmente .

Mani
quelle
1. Wie Sie auf # 8 erwähnt haben, muss es kein Layout haben. 6. Sie haben den Teil nach "bedeutet" verpasst. Wie auch immer, danke, dass du anderen geholfen hast, dies klarer zu machen. Ich werde dir +1 geben.
Android-Entwickler
1
In Bezug auf # 8 wäre ein mögliches Beispiel für ein Fragment ohne Layout (dh ein "kopfloses" Fragment) eines, das eine Aufgabe ausführt, die trotz ihrer kurzen Dauer (z. B. einer kurzen HTTP-Anforderung) immer noch erforderlich ist, um Konfigurationsänderungen zu überstehen, und daher davon abhängt über die genaue Fragmentinstanz, die über sie hinweg beibehalten wird (mithilfe von setRetainInstance (true) für das Fragment). Bei Layoutfragmenten ist setRetainInstance (true) wenig sinnvoll, da verhindert wird, dass mit ihren Ansichten verknüpfte Ressourcen bei Bedarf freigegeben werden (dh ein Speicherverlust).
Piovezan
HINWEIS: "# 8" ist jetzt "# 7".
ToolmakerSteve
21

Dies sind wichtige Informationen, die ich auf Fragmenten gefunden habe:

In der Vergangenheit wurde jeder Bildschirm in einer Android-App als separate Aktivität implementiert. Dies stellt eine Herausforderung beim Übergeben von Informationen zwischen Bildschirmen dar, da der Android Intent-Mechanismus das Übergeben eines Referenztyps (dh eines Objekts) direkt zwischen Aktivitäten nicht zulässt. Stattdessen muss das Objekt serialisiert oder eine global zugängliche Referenz verfügbar gemacht werden.

Indem jeder Bildschirm zu einem separaten Fragment gemacht wird, werden diese Kopfschmerzen beim Übergeben von Daten vollständig vermieden. Fragmente existieren immer im Kontext einer bestimmten Aktivität und können immer auf diese Aktivität zugreifen. Durch Speichern der interessierenden Informationen in der Aktivität kann das Fragment für jeden Bildschirm einfach über die Aktivität auf die Objektreferenz zugreifen.

Quelle: https://www.pluralsight.com/blog/software-development/android-fragments

Kaveesh Kanwal
quelle
3
Das stimmt, aber es gibt Lösungen dafür: Verwenden Sie Parcelable, wenn es sich nicht um ein großes Objekt handelt (und es gibt ein Plugin, um es einfacher zu machen), und wenn es sich um ein großes Objekt handelt, können Sie immer eine statische Referenz verwenden, die auf null gesetzt wird wenn Sie zu der neuen Aktivität gelangen (oder wenn Sie sie zerstören, je nach Ihren Anforderungen).
Android-Entwickler
@androiddeveloper: "use Parcelable" entspricht meiner Definition von "Kopfschmerzen bei der Datenübertragung, die durch die Verwendung von Fragmenten vermieden werden". Wenn es einen komplexen gemeinsamen Status gibt, der bestehen bleiben muss, während eine Reihe von Bildschirmen vorbeizieht, ist IMHO eine Aktivität + Fragmente eine gute Lösung. (Obwohl ich den Fragment-Back-Stack aufgegeben und selbst verwaltet habe, was "Back" bedeutet.)
ToolmakerSteve
Die Verwendung des Schnittstellenentwurfsmusters zwischen Fragmenten durch eine Containeraktivität ist ein sehr modularer Ansatz, um nicht nur Objekte, sondern auch Klickereignis-Listener und Methodenargumente an andere Fragmente oder an die Hauptcontaineraktivität zurückzugeben.
Kaveesh Kanwal
10

Aktivitäten sind die Vollbildkomponenten in der App mit der Symbolleiste, alles andere sind vorzugsweise Fragmente. Eine übergeordnete Vollbildaktivität mit einer Symbolleiste kann mehrere Bereiche, scrollbare Seiten, Dialogfelder usw. (alle Fragmente) enthalten, auf die alle vom übergeordneten Element aus zugegriffen werden können und über das übergeordnete Element kommunizieren.

Beispiel:

Aktivität A, Aktivität B, Aktivität C:

  • Bei allen Aktivitäten muss derselbe Code wiederholt werden, um beispielsweise eine grundlegende Symbolleiste anzuzeigen, oder von einer übergeordneten Aktivität geerbt werden (die Verwaltung ist umständlich).
  • Um von einer Aktivität zur anderen zu wechseln, müssen sich entweder alle im Speicher befinden (Overhead) oder eine muss zerstört werden, damit die andere geöffnet werden kann.
  • Die Kommunikation zwischen Aktivitäten kann über Absichten erfolgen.

vs.

Aktivität A, Fragment 1, Fragment 2, Fragment 3:

  • Keine Code-Wiederholung, alle Bildschirme haben Symbolleisten usw. aus dieser einen Aktivität.
  • Verschiedene Möglichkeiten, um von einem Fragment zum nächsten zu wechseln - Pager, Mehrfachfenster usw. anzeigen
  • Die Aktivität enthält die meisten Daten, sodass nur eine minimale Kommunikation zwischen Fragmenten erforderlich ist. Bei Bedarf kann dies problemlos über Schnittstellen erfolgen.
  • Fragmente müssen nicht im Vollbildmodus vorliegen, da sie sehr flexibel gestaltet werden können.
  • Fragmente müssen das Layout nicht aufblasen, wenn keine Ansichten erforderlich sind.
  • Mehrere Aktivitäten können dasselbe Fragment verwenden.
Chandrima Bhattacharjee
quelle
perfekte Antwort!
Sathesh
8

Fragmente sind in einigen Fällen von besonderem Nutzen, beispielsweise wenn wir auf allen unseren Seiten eine Navigationsleiste behalten möchten. Sie können ein Rahmenlayout mit einem beliebigen Fragment aufblasen und haben dennoch Zugriff auf die Navigationsschublade.

Wenn Sie eine Aktivität verwendet hätten, müssten Sie die Schublade in allen Aktivitäten behalten, was zu redundantem Code führt. Dies ist eine interessante Verwendung eines Fragments.

Ich bin neu in Android und denke immer noch, dass ein Fragment auf diese Weise hilfreich ist.

Nithin Baby
quelle
Ja. Manchmal bin ich jedoch immer noch verwirrt über die richtige Verwendung von Fragmenten, und das liegt am komplexen Lebenszyklus von Fragmenten und Aktivitäten.
Android-Entwickler
@androiddeveloper Verwenden Sie meistens nur Aktivitäten?
Michael Alan Huff
@MichaelAlanHuff Wenn Sie Tablets unterstützen, ist es meiner Meinung nach besser, Fragmente zu verwenden. Wenn Sie Orientierungsänderungen und ähnliche Ereignisse unterstützen, möchten Sie möglicherweise DialogFragment verwenden, da Sie diese wiederherstellen können
Android-Entwickler
@androiddeveloper, das denke ich auch. Ich habe DialogFragments nicht so oft verwendet. Um die Modularität der Logik zu unterstützen, beginnen viele Android-Entwickler, benutzerdefinierte Ansichten zu verwenden, um die Logik a la square zu speichern. Hier ist ein kürzlich gehaltener Vortrag über benutzerdefinierte Ansichten, den ein Ingenieur von Airbnb vimeo.com/127799187
Michael Alan Huff
@MichaelAlanHuff Die Verwendung von Fragmenten kann auch nützlich sein, wenn Sie der Meinung sind, dass der aktuelle Bildschirm Teil eines anderen Bildschirms sein könnte.
Android-Entwickler
5

Ich weiß, dass dies bereits zu Tode diskutiert wurde, aber ich möchte noch einige Punkte hinzufügen:

  • Frags können zum Auffüllen von Menus verwendet werden und können MenuItemKlicks selbst verarbeiten. So erhalten Sie weitere Modulationsoptionen für Ihre Aktivitäten. Sie können ContextualActionBar-Inhalte usw. ausführen, ohne dass Ihre Aktivität davon Kenntnis hat, und sie im Grunde genommen von den grundlegenden Aufgaben Ihrer Aktivität (Navigation / Einstellungen / Info) entkoppeln.

  • Ein übergeordnetes Frag mit untergeordneten Frags kann Ihnen weitere Optionen zum Modulieren Ihrer Komponenten bieten. Sie können beispielsweise Frags einfach austauschen, neue Frags in einen Pager einfügen oder sie entfernen und neu anordnen. Alles ohne dass Ihre Aktivität etwas darüber weiß und sich nur auf die übergeordneten Dinge konzentriert.

einschnaehkeee
quelle
0

Fragmente leben innerhalb der Aktivität und haben:

  • seinen eigenen Lebenszyklus
  • sein eigenes Layout
  • seine eigenen Kinderfragmente und etc.

Stellen Sie sich Fragmente als eine Unteraktivität der Hauptaktivität vor, zu der sie gehört, sie kann nicht für sich existieren und sie kann immer wieder aufgerufen / wiederverwendet werden. Hoffe das hilft :)

Maniix
quelle
Über den zweiten Punkt ("sein eigenes Layout") ist dies optional. Ein Fragment muss überhaupt keine Ansicht haben.
Android-Entwickler
0

1.Zwecke zur Verwendung eines Fragments?

  • Ans:
    1. Umgang mit Unterschieden im Geräteformfaktor.
    2. Weitergabe von Informationen zwischen App-Bildschirmen.
    3. Organisation der Benutzeroberfläche.
    4. Erweiterte UI-Metaphern.
Prithiv Dharmaraj
quelle
0

Ein Fragment lebt in einer Aktivität, während eine Aktivität für sich lebt.

superkytoz
quelle
6
"auf sich selbst"? Vielleicht "alleine"? Oder "von selbst"?
Peter Mortensen