Fragment oder Unterstützungsfragment?

125

Ich entwickle eine App, die Android> = 4.0 unterstützt. Es werden Fragmente aus dem android.appPaket verwendet. Da ich Probleme mit der älteren Fragmentimplementierung in 4.0 wie dieser habe , die bereits in der Supportbibliothek behoben sind, denke ich darüber nach, von der Supportbibliothek zurück zur Fragmentimplementierung zu wechseln, um eine zuverlässigere und konsistentere Implementierung zu erhalten.

Wie ist Ihre Meinung dazu? Verwenden Sie Fragmente aus der Support-Bibliothek, obwohl sie bereits verfügbar sind, wenn Sie für Android 4 entwickeln?

brillenheini
quelle
2
Dies ist eine schöne Frage (+1, weil es mich neugierig macht). Auch dafür gibt es im Web keine gute Erklärung. Ich verwende die Support-Bibliothek für meine App und frage mich, ob ich falsch liege oder nicht, da ich beim Kompilieren oder beim Testen keinen Fehler bemerkt habe.
JJ86
2
@animuson Die Antwort von brillenheini beweist, dass dies keine primär meinungsbasierte Antwort ist.
OneWorld

Antworten:

90

Aus meiner Erfahrung ist die Verwendung derselben Fragmentimplementierung auf allen Android-Geräten ein großer Vorteil. Ich konnte nicht alle NullPointerExceptions loswerden, wenn der Status unter Android 4.0 mit nativen Fragmenten gespeichert wurde. Mit der Support-Bibliothek sind alle verschwunden. Auch konnte ich bei diesem Ansatz bisher keinen Nachteil feststellen.

Meine Antwort auf meine eigene Frage lautet nun: Bei der Entwicklung für Android 4.x ist es eine gute Idee, die Fragmente aus der Support-Bibliothek zu verwenden. In der Support-Bibliothek wurden Fehler behoben, die in älteren Fragmentimplementierungen noch vorhanden sind, und sie werden häufig mit weiteren Fehlerkorrekturen aktualisiert.

brillenheini
quelle
11
Also, was ist der Zweck des android.app.Fragmentdann? Wenn Sie dies Ihrer Antwort hier mit etwas mehr Erklärung hinzufügen können , wäre ich voll und ganz zufrieden. Vielen Dank!
Jonstaff
1
@ Jonstaff Der Grund ist wahrscheinlich historisch. Bitte sehen Sie meine aktualisierte Antwort dort.
Brillenheini
11
Der Vollständigkeit halber scheint es Dinge zu geben, die Support-Fragmente nicht können (z. B. animiert werdenobjectAnimator , selbst wenn das eigentliche Zielbetriebssystem dies unterstützt). Welche, falls Sie verwenden ViewPager, bedeutet , dass Sie Adapter von v13 Support - Bibliothek verwenden, sonst kann man nicht beide viewpager und Flipping Animation haben.
GSerg
5
Seien Sie auch vorsichtig, da die v13-Bibliothek ab August 2014 keine verschachtelten Fragmente mehr ausführen kann.
Martin Marconcini
1
Warum haben sich die Leute bei Google für die Verwendung der v13-Bibliothek für die iosched-App github.com/google/iosched/blob/master/android/src/main/java/com/… entschieden? Sie müssen einen Grund haben
forcewill
40

Ein wichtiger Grund, sich SupportFragmentfür eine Weile an die zu halten, ist, dass Sie ChildFragmentManagerbis zur API 17 keinen Zugriff auf die API haben. Die Support-Bibliothek bietet Ihnen eine Support-Version des untergeordneten Fragment-Managers.

Dies wird zu einer großen Sache, wenn Sie Fragmente haben, die andere Fragmente enthalten. Dies ist bei Tablet-Anwendungen mit hoher Komplexität üblich und / oder Ihre Gesamtarchitektur basiert entweder auf einem Layout mit Registerkarten oder verwendet die Navigationsleiste.

Ross Hambrick
quelle
21

Ich war auch frustriert darüber, dass ich die Support-Bibliotheken einbinden musste, obwohl ich auf Android 4.0+ abzielte - aber es scheint, dass dies offiziell empfohlen wird:

Das Android Support Library-Paket enthält mehrere Bibliotheken, die in Ihre Anwendung aufgenommen werden können. Jede dieser Bibliotheken unterstützt eine bestimmte Reihe von Android-Plattformversionen und Funktionen.

In diesem Handbuch werden die wichtigen Funktionen und die Versionsunterstützung der Support-Bibliotheken erläutert, damit Sie entscheiden können, welche davon in Ihre Anwendung aufgenommen werden sollen. Im Allgemeinen empfehlen wir, die v4-Unterstützung und die v7-Appcompat-Bibliotheken einzubeziehen, da sie eine Vielzahl von Android-Versionen unterstützen und APIs für empfohlene Benutzeroberflächenmuster bereitstellen.

http://developer.android.com/tools/support-library/features.html

Sourabhj
quelle
Dies sollte die akzeptierte Antwort sein, obwohl @brillenheini selbst eine Antwort gegeben hat. Es beantwortet die Frage mit der besten Genauigkeit und Prägnanz.
Arvindh Mani
4

IMHO, wenn Sie planen, nur für 4.0 zu entwickeln, würde ich empfehlen, mit den nativen Bibliotheken zu gehen, da die ausführbare Datei kleiner wird. Es ist wahr, dass Sie in früheren Versionen möglicherweise auf Probleme mit Fehlern stoßen, aber ich denke, die meisten davon sollten ziemlich trivial sein, um sie zu umgehen. Außerdem sollte die Kompatibilitätsbibliothek den nativen Fragmenten zugeordnet werden, falls Sie ohnehin mit 4.0 oder höher arbeiten. Sie könnten also ohnehin mit solchen Problemen zu kämpfen haben. Das Problem mit den Support-Bibliotheken ist, dass viele Klassen zweimal angezeigt werden (einmal in der Support-Paketstruktur und einmal in der "nativen" Paketstruktur), was die Entwicklung etwas umständlicher macht.

Wenn Sie jedoch auch Ihre App vor 4.0 veröffentlichen möchten, führt kein Weg an der Support-Bibliothek vorbei. Da es ungefähr 38% aller Benutzer in 2.3 gibt, kann es wirtschaftlich sinnvoll sein, diese Betriebssystemversion einzuschließen. In einem solchen Fall können Sie die Support-Bibliothek in Kombination mit Jake Wartons ActionBarSherlock verwenden (oder mit der Googles-Support-ActionBar-Bibliothek, sobald sie endgültig freigegeben ist).

RaB
quelle
3
Danke für deine Antwort. Da ich ViewPager benötige, muss ich die Support-Bibliothek trotzdem einbinden. Außerdem versucht das Support-Fragment nicht, zur nativen Implementierung zu wechseln, falls verfügbar. Das sagen die Dokumente .
Brillenheini
Ja, die Sache ist (wie @brillenheini sagte), dass Sie v4 benötigen, um den ViewPager zu haben. Selbst wenn Sie nur auf v13 + -Geräte abzielen, werden Sie wahrscheinlich trotzdem v4 haben.
Sotti
Ich habe das auch gerade entdeckt (ViewPager benötigt v4) auf meiner API 21 und in der App. Meh: - /
mraviator