Pourquoi des fragments et quand utiliser des fragments au lieu d'activités?

485

Dans Android API 11+, Google a publié une nouvelle classe appelée Fragment.

Dans les vidéos, Google suggère que chaque fois que possible ( link1 , lien2 ), nous devrions utiliser des fragments au lieu d'activités, mais ils n'a pas expliqué exactement pourquoi.

Quel est le but des fragments et de leurs utilisations possibles (autres que certains exemples d'interface utilisateur qui peuvent être facilement atteints par de simples vues / mises en page)?

Ma question concerne les fragments:

  1. À quoi sert l'utilisation d'un fragment?
  2. Quels sont les avantages et les inconvénients de l'utilisation de fragments par rapport à l'utilisation d'activités / vues / mises en page?

Questions bonus:

  1. Pouvez-vous donner des utilisations vraiment intéressantes des fragments? Des choses que Google n'a pas mentionnées dans leurs vidéos?
  2. Quelle est la meilleure façon de communiquer entre les fragments et les activités qui les contiennent?
  3. Quelles sont les choses les plus importantes à retenir lorsque vous utilisez des fragments? Des conseils et des avertissements de votre expérience?
développeur android
la source

Réponses:

282

# 1 & # 2 quels sont les objectifs de l'utilisation d'un fragment et quels sont les avantages et les inconvénients de l'utilisation de fragments par rapport à l'utilisation d'activités / vues / mises en page?

Les fragments sont la solution d'Android pour créer des interfaces utilisateur réutilisables. Vous pouvez réaliser certaines des mêmes choses en utilisant des activités et des mises en page (par exemple en utilisant des inclusions). Toutefois; les fragments sont connectés à l'API Android, à partir de HoneyComb, et plus. Permettez-moi de développer;

  • Le ActionBar. Si vous voulez que des onglets là-haut ActionBar.TabListenerpermettent de naviguer dans votre application, vous voyez rapidement que l' interface vous donne un FragmentTransactionargument d'entrée pour la onTabSelectedméthode. Vous pourriez probablement ignorer cela et faire autre chose et intelligent, mais vous travailleriez contre l'API, pas avec elle.

  • Les FragmentManagerpoignées «dos» pour vous d'une manière très astucieuse. Retour ne signifie pas retour à la dernière activité, comme pour les activités régulières. Cela signifie revenir à l'état de fragment précédent.

  • Vous pouvez utiliser le cool ViewPageravec un FragmentPagerAdapterpour créer des interfaces de balayage. Le FragmentPagerAdaptercode est beaucoup plus propre qu'un adaptateur standard et il contrôle les instanciations des fragments individuels.

  • Votre vie sera beaucoup plus facile si vous utilisez des fragments lorsque vous essayez de créer des applications pour téléphones et tablettes. Étant donné que les fragments sont tellement liés aux API Honeycomb +, vous souhaiterez également les utiliser sur les téléphones pour réutiliser le code. C'est là que la bibliothèque de compatibilité est utile.

  • Vous pouvez et devez même utiliser des fragments pour des applications destinées uniquement aux téléphones. Si vous envisagez la portabilité. J'utilise ActionBarSherlocket les bibliothèques de compatibilité pour créer des applications "à la recherche d'ICS", qui se ressemblent jusqu'à la version 1.6. Vous obtenez les dernières fonctionnalités comme le ActionBar, avec les onglets, le débordement, la barre d'action fractionnée, le viseur, etc.

Bonus 2

La meilleure façon de communiquer entre les fragments est l'intention. Lorsque vous appuyez sur quelque chose dans un fragment, vous appelez généralement StartActivity()avec des données. L'intention est transmise à tous les fragments de l'activité que vous lancez.

Glenn Bech
la source
5
tout d'abord, merci.J'apprécie les personnes qui donnent des réponses informatives (mais courtes) et non seulement me donnent un lien vers un manuel. ?
développeur android
4
Je pense que vous devez être plus direct dans vos questions. Je viens de donner quatre avantages majeurs ci-dessus.
Glenn Bech
2
ok, qu'en est-il des inconvénients par rapport aux vues et activités personnalisées?
développeur android
2
comment communiquez-vous entre les fragments en utilisant des intentions? tous les fragments doivent-ils être "vivants" (ajoutés à l'activité) pour pouvoir communiquer entre eux?
développeur Android
55
Un fragment ne devrait jamais parler directement à un autre fragment, mais plutôt passer par l'activité parentale. De cette façon, vous ne vous retrouvez pas avec du code spaghetti mais facile à gérer.
slott
70

Je ne sais pas à quelle (s) vidéo (s) vous faites référence, mais je doute qu'ils disent que vous devez utiliser des fragments au lieu d'activités, car ils ne sont pas directement interchangeables. Il y a en fait une entrée assez détaillée dans le Dev Guide, pensez à le lire pour plus de détails.

En bref, les fragments vivent à l'intérieur des activités, et chaque activité peut héberger de nombreux fragments. Comme les activités, elles ont un cycle de vie spécifique, contrairement aux activités, ce ne sont pas des composants d'application de niveau supérieur. Les avantages des fragments incluent la réutilisation du code et la modularité (par exemple, en utilisant la même vue de liste dans de nombreuses activités), y compris la possibilité de créer des interfaces à volets multiples (surtout utiles sur les tablettes). Le principal inconvénient est (en partie) une complexité supplémentaire. Vous pouvez généralement réaliser la même chose avec des vues (personnalisées) d'une manière non standard et moins robuste.

Nikolay Elenkov
la source
1
question mise à jour. il a maintenant des liens vers les vidéos de google. aussi, merci pour l'explication, mais j'ai encore besoin d'éclaircissements sur ma question.
développeur Android
5
Lisez l'entrée du guide de développement, elle contient plus qu'assez de détails. Il est peu probable que vous obteniez une réponse aux «utilisations sympas des fragments» sur SO - trop vague et il n'y a pas de réponse unique. Le numéro 4 est spécifiquement répondu dans le guide de développement
Nikolay Elenkov
1
pour autant que je sache, cette méthode crée une dépendance dont l'activité peut contenir quel fragment. veuillez également répondre aux principales questions (les deux premières).
développeur android
3
Merci au développeur Android d'avoir insisté sur les réponses à la question de base. ATM Je n'ai rien vu d'utile dans la classe Fragment en utilisant la balise XML "include". Le genre de choses que je trouverais utiles serait la possibilité de spécifier une disposition qui se transformerait comme par magie en la meilleure expérience utilisateur à toutes les résolutions. D'après ce que je peux vous dire, vous devez toujours le faire vous-même dans le code. Une autre valeur potentielle serait un moyen de regrouper le code + les ressources dans des composants réutilisables qui ne se trouvent pas dans les applications de réutilisation, mais qui ne semblent pas être là encore. Je veux une très bonne raison.
Melinda Green
2
Je commence à comprendre la façon dont Google suggère d'utiliser des fragments, mais je suis assez d'accord avec @NikolayElenkov .. Pour moi, l'utilisation d'Activités semble toujours être la manière la plus robuste et la moins complexe ..
andrea.rinaldi
49

Un fragment est un élément de l'interface utilisateur ou du comportement d'une application qui peut être placé dans une activité, ce qui permet une conception d'activité plus modulaire. Ce ne sera pas faux si nous disons qu'un fragment est une sorte de sous-activité.

Voici des points importants sur un fragment:

  1. Un fragment a sa propre disposition et son propre comportement avec ses propres rappels de cycle de vie.

  2. Vous pouvez ajouter ou supprimer des fragments dans une activité pendant que l'activité est en cours d'exécution.

  3. Vous pouvez combiner plusieurs fragments en une seule activité pour créer une interface utilisateur à volets multiples.

  4. Un fragment peut être utilisé dans plusieurs activités.

  5. Le cycle de vie du fragment est étroitement lié au cycle de vie de son activité hôte.

  6. Lorsque l'activité est suspendue, tous les fragments disponibles dans l'activité seront également arrêtés.

  7. Un fragment peut implémenter un comportement sans composant d'interface utilisateur.

  8. Des fragments ont été ajoutés à l'API Android dans Android 3 (Honeycomb) avec l'API version 11.

Pour plus de détails, veuillez visiter le site officiel, Fragments .

mani
la source
1. Comme vous l'avez mentionné au point 8, il n'a pas besoin d'avoir une disposition. 6. vous avez manqué la partie après "signifie". Quoi qu'il en soit, merci d'avoir aidé les autres à clarifier les choses. Je te donnerai +1.
développeur Android
1
En ce qui concerne # 8, un exemple possible de fragment sans mise en page (c'est-à-dire un fragment sans tête) serait celui qui exécute une tâche qui, malgré sa courte durée (comme une courte requête HTTP), est toujours nécessaire pour survivre aux changements de configuration et dépend donc sur l'instance de fragment exacte étant préservée à travers eux (en utilisant setRetainInstance (true) sur le fragment). En ce qui concerne les fragments de mise en page, setRetainInstance (true) n'a pas beaucoup de sens, car il empêche les ressources associées à leurs vues d'être libérées si nécessaire (c'est-à-dire une fuite de mémoire).
Piovezan
REMARQUE: "# 8" est maintenant "# 7".
ToolmakerSteve
21

Ce sont des informations importantes que j'ai trouvées sur des fragments:

Historiquement, chaque écran d'une application Android était implémenté comme une activité distincte. Cela crée un défi lors de la transmission d'informations entre les écrans, car le mécanisme Android Intent ne permet pas de passer un type de référence (c'est-à-dire un objet) directement entre les activités. À la place, l'objet doit être sérialisé ou une référence accessible à l'échelle mondiale doit être disponible.

En faisant de chaque écran un fragment distinct, ces maux de tête de transmission de données sont complètement évités. Les fragments existent toujours dans le contexte d'une activité donnée et peuvent toujours accéder à cette activité. En stockant les informations d'intérêt dans l'activité, le fragment pour chaque écran peut simplement accéder à la référence d'objet via l'activité.

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

Kaveesh Kanwal
la source
3
C'est vrai, mais il existe des solutions pour cela: utilisez Parcelable quand ce n'est pas un objet énorme (et il y a un plugin pour le rendre plus facile), et si c'est un objet énorme, vous pouvez toujours utiliser une référence statique qui sera définie sur null lorsque vous arrivez à la nouvelle activité (ou lorsque vous la détruisez, selon vos besoins).
développeur Android
@androiddeveloper: "utiliser Parcelable" correspond à ma définition d'un "mal de tête de transmission de données qui est évité en utilisant des fragments". S'il y a un état partagé complexe qui doit persister pendant qu'une série d'écrans passe, une activité + des fragments est une bonne solution, à mon humble avis. (Bien que j'aie abandonné la pile arrière de Fragment, et ai fait ma propre gestion de ce que signifie "dos".)
ToolmakerSteve
L'utilisation d'un modèle de conception d'interface entre des fragments via une activité de conteneur est une approche beaucoup plus modulaire pour transmettre non seulement des objets, mais également des écouteurs d'événements et des arguments de méthode aux autres fragments ou à l'activité de conteneur principale.
Kaveesh Kanwal
10

Les activités sont les composants plein écran de l'application avec la barre d'outils, tout le reste est de préférence des fragments. Une activité parent en plein écran avec une barre d'outils peut avoir plusieurs volets, pages déroulantes, boîtes de dialogue, etc. (tous les fragments), tous accessibles depuis le parent et communiquant via le parent.

Exemple:

Activité A, Activité B, Activité C:

  • Toutes les activités doivent avoir le même code répété, pour afficher une barre d'outils de base par exemple, ou hériter d'une activité parent (devient lourde à gérer).
  • Pour passer d'une activité à l'autre, soit elles doivent toutes être en mémoire (overhead), soit l'une doit être détruite pour que l'autre s'ouvre.
  • La communication entre les activités peut se faire via Intents.

contre

Activité A, fragment 1, fragment 2, fragment 3:

  • Pas de répétition de code, tous les écrans ont des barres d'outils, etc. de cette activité.
  • Plusieurs façons de passer d'un fragment au suivant - afficher un pager, un volet multiple, etc.
  • L'activité contient la plupart des données, donc une communication inter-fragments minimale est nécessaire. Si cela est toujours nécessaire, cela peut être fait facilement via des interfaces.
  • Les fragments n'ont pas besoin d'être en plein écran, beaucoup de flexibilité dans leur conception.
  • Les fragments n'ont pas besoin de gonfler la disposition si les vues ne sont pas nécessaires.
  • Plusieurs activités peuvent utiliser le même fragment.
Chandrima Bhattacharjee
la source
réponse parfaite!
Sathesh
8

Les fragments sont particulièrement utiles dans certains cas, comme lorsque nous voulons conserver un tiroir de navigation dans toutes nos pages. Vous pouvez gonfler une disposition de cadre avec le fragment que vous voulez et toujours avoir accès au tiroir de navigation.

Si vous aviez utilisé une activité, vous auriez dû garder le tiroir dans toutes les activités, ce qui rend le code redondant. Il s'agit d'une utilisation intéressante d'un fragment.

Je suis nouveau sur Android et je pense toujours qu'un fragment est utile de cette façon.

Nithin Baby
la source
Oui. Cependant, je suis toujours parfois confus quant à la bonne façon d'utiliser les fragments, et c'est à cause du cycle de vie complexe des fragments et des activités.
développeur Android
@androiddeveloper utilisez-vous principalement des activités?
Michael Alan Huff
@MichaelAlanHuff Lors de la prise en charge des tablettes, je pense qu'il est préférable d'utiliser des fragments. En outre, lorsque vous prenez en charge les changements d'orientation et d'autres événements similaires, vous pouvez utiliser DialogFragment, car cela vous permet de les restaurer
développeur Android
@androiddeveloper, c'est ce que je pense aussi. Je n'ai pas utilisé DialogFragments aussi souvent. Pour aider à la modularité de la logique, de nombreux développeurs Android commencent à utiliser des vues personnalisées pour maintenir la logique à mortier. Voici un récent exposé sur les vues personnalisées donné par un ingénieur d'Airbnb vimeo.com/127799187
Michael Alan Huff
@MichaelAlanHuff utilisant des fragments pourrait également être utile si vous pensez que l'écran actuel pourrait faire partie d'un autre écran.
développeur Android
5

Je sais que cela a déjà été discuté à mort, mais j'aimerais ajouter quelques points supplémentaires:

  • Les frags peuvent être utilisés pour remplir les Menus et peuvent gérer les MenuItemclics seuls. Donnant ainsi des options de modulation supplémentaires pour vos activités. Vous pouvez faire des trucs ContextualActionBar et ainsi de suite sans que votre activité ne le sache et peut fondamentalement le découpler des trucs de base que gère votre activité (Navigation / Paramètres / À propos).

  • Un Frag parent avec Frags enfant peut vous donner d'autres options pour moduler vos composants. Par exemple, vous pouvez facilement échanger des Frags, placer de nouveaux Frags dans un téléavertisseur ou les supprimer, les réorganiser. Le tout sans que votre activité en sache quoi que ce soit, se concentrant uniquement sur les choses de niveau supérieur.

einschnaehkeee
la source
0

Fragments vit au sein de l'activité et a:

  • son propre cycle de vie
  • sa propre mise en page
  • ses propres fragments d'enfant et etc.

Considérez les fragments comme une sous-activité de l'activité principale à laquelle ils appartiennent, ils ne peuvent pas exister par eux-mêmes et peuvent être appelés / réutilisés encore et encore. J'espère que cela t'aides :)

maniix
la source
En fait, sur le deuxième point ("sa propre mise en page"), c'est facultatif. Un fragment n'a pas du tout besoin d'avoir une vue.
développeur Android
0

1.Pour utiliser un fragment?

  • Rép:
    1. Gérer les différences de facteur de forme des appareils.
    2. Transmission d'informations entre les écrans d'application.
    3. Organisation de l'interface utilisateur.
    4. Métaphores avancées de l'interface utilisateur.
Prithiv Dharmaraj
la source
0

Un fragment vit à l'intérieur d'une activité, tandis qu'une activité vit seule.

superkytoz
la source
6
"sur lui-même"? Peut-être "seul"? Ou "par lui-même"?
Peter Mortensen