Une activité et tous les autres fragments [fermé]

158

Je pense mettre en œuvre un écran avec Activityet tous les autres écrans avec Fragmentset managing all the fragments thru the activity.

Est-ce que c'est une bonne idée? et ma réponse est NON mais je veux tout de même en savoir plus clairement sur cette pensée.

Quels sont les avantages et les inconvénients de l'idée?

Remarque:

Veuillez ne pas me donner le lien pour le fragment et l'activité.

ÉDITER:

Voici quelque chose sur les fragments et l'activité:

Avantages:

  1. Les fragments sont destinés à être utilisés avec des activités en tant que sous-activité.
  2. Les fragments ne remplacent pas les activités.
  3. Les fragments sont destinés à être réutilisés (besoin de savoir de quelle manière la réutilisabilité peut être obtenue.).
  4. Les fragments sont le meilleur moyen d'écrire du code pour prendre en charge les tablettes et les téléphones.

Les inconvénients:

  1. Nous devons implémenter l'interface pour obtenir les données des fragments.
  2. Pour le dialogue, nous devons faire un long chemin pour le montrer.

Pourquoi utiliser des fragments si nous n'envisageons pas de comprimés? Quelle est la différence d'heure de départ entre l'activité et le fragment?

Vineet Shukla
la source
Pouvez-vous expliquer pourquoi vous pensez que la réponse est non? Je ne suis pas d'accord, mais il est plus facile de répondre aux préoccupations que vous pourriez avoir à propos de cette approche si nous connaissons ces préoccupations.
Alexander Lucas le
1
@AlexanderLucas La réponse que j'ai donnée non parce que cela rend votre code moins modulaire, augmente la complexité.
Vineet Shukla
@Ski Vous vous concentrez davantage sur l'acceptation de votre réponse, concentrez-vous sur ce qui est demandé et sur la meilleure réponse que vous pouvez fournir.
Vineet Shukla
3
Pour tous ceux qui trouvent cela, j'ai arrêté le refactor parce que les choses se sont vraiment compliquées très vite.
theblang
18
C'est une bonne question qui n'aurait pas dû être fermée.
Jim In Texas

Réponses:

94

Cela dépend de l'application que vous créez. J'ai créé plusieurs applications en utilisant les deux approches et je ne peux pas dire qu'une façon est toujours meilleure que l'autre. La dernière application que j'ai créée a utilisé l' Activityapproche unique et une navigation de style Facebook. Lorsque je sélectionne des éléments dans la liste de navigation, je mets à jour un seul Fragmentconteneur pour afficher cette section.

Cela dit, avoir un single Activityintroduit également beaucoup de complexités. Supposons que vous ayez un formulaire d'édition et que pour certains des éléments que l'utilisateur doit sélectionner ou créer, il doit accéder à un nouvel écran. Avec les activités, nous appellerions simplement le nouvel écran avec, startActivityForResultmais Fragmentsil n'y a rien de tel, vous finissez donc par stocker la valeur sur le Activityet demander au fragment d'édition principal de vérifier Activitysi les données ont été sélectionnées et doivent être affichées à l'utilisateur.

Ce que dit Aravind sur le fait d'être collé à un seul Activitytype est également vrai mais pas vraiment limitatif. Votre activité serait une FragmentActivity et tant que vous n'en avez pas besoin, MapViewil n'y a pas de réelles limitations. Si vous souhaitez afficher des cartes, cela peut être fait, mais vous devrez soit modifier la bibliothèque de compatibilité Android pour l' FragmentActivityétendre, MapActivitysoit utiliser les cartes android-support-v4-googlemaps disponibles au public .

En fin de compte, la plupart des développeurs que je connais qui Activityont emprunté la même voie sont revenus à plusieurs activités pour simplifier leur code. En ce qui concerne l'interface utilisateur, sur une tablette, vous êtes parfois coincé en utilisant un seul Activitypour réaliser l'interaction jamais folle que vos concepteurs proposent :)

-- ÉDITER --

Google a enfin publié MapFragmentla bibliothèque de compatibilité afin que vous n'ayez plus à utiliser le hack android-support-v4-googlemaps. En savoir plus sur la mise à jour ici: API Google Maps Android v2

- MODIFIER 2 -

Je viens de lire ce super article sur l'état moderne (2017) des fragments et je me suis souvenu de cette vieille réponse. Je pensais que je partagerais: Fragments: la solution à tous les problèmes d'Android

JustinMorris
la source
6
Il y a settargetfragmentet vous pouvez gérer l'activité comme une startforresultprocédure.
Lalith B
1
À mon avis, les activités existent simplement parce que c'est l'ancien système. Le fragment n'existait pas auparavant. Il n'y a vraiment rien que les activités peuvent et les fragments ne peuvent pas, à part les formalités. Je pourrais même imaginer qu'à un moment donné, les activités sont supprimées et que tout n'est qu'un fragment.
Ixx
1
Pour résumer les inconvénients des fragments - seulement vous donnez, il n'y en a pas vraiment. startActivityForResult comme le dit Lalith B a un équivalent, et les cartes ne sont pas non plus un problème. En plus de cela, tout (état de sauvegarde, etc.) peut être géré avec les méthodes de cycle de vie du fragment.
Ixx
85

Je suis sur le point de terminer un projet (5 mois en développement), qui comporte 1 activité et 17 fragments, tous en plein écran. Ceci est mon deuxième projet basé sur des fragments (le précédent était de 4 mois).

Avantages

  • L'activité principale est de 700 lignes de code, juste bien gérer l'ordre de navigation des fragments.
  • Chaque fragment est joliment séparé dans sa propre classe et est relativement petit (~ quelques centaines de lignes de trucs d'interface utilisateur).
  • La direction peut dire: "hé, pourquoi ne pas changer l'ordre de ces écrans", et je peux le faire très facilement, car ces fragments ne dépendent pas les uns des autres, ils communiquent tous à travers l'activité. Je n'ai pas à fouiller dans les activités individuelles, pour trouver où ils s'appellent.
  • mon application est très graphique et ne fonctionnerait jamais comme activité 1 écran 1. Toutes ces sous-activités dans la mémoire rendraient l'application à court de mémoire tout le temps, donc je devrais finish()toutes les activités non visibles et créer la même logique de contrôle pour la navigation, comme je le ferais avec des fragments. Autant le faire avec des fragments juste à cause de cela.
  • si jamais nous faisons une application pour tablette, nous aurons plus de facilité à re-factoriser les choses, car tout est déjà bien séparé.

Les inconvénients

  • vous devez apprendre, comment utiliser des fragments
Tamas
la source
1
n'était pas sûr d'avoir trop de fragments et seulement maintenant d'activité ... des problèmes de production, et le blâme est sur vous !! :)
Shahar
1
@Dinash ne laissez pas le système d'exploitation redémarrer votre activité. gérer vous-même le changement d'orientation. en savoir plus ici: stackoverflow.com/questions/5913130/…
Tamas
1
@Tamas Aviez-vous des écrans multi-fragments (ex. Master-detail) et si oui, comment avez-vous géré cela?
theblang
7
@Tamas Cette approche est fortement anti androïde. Vous vous retrouvez avec la classe DIEU. Le système Android est conçu pour fonctionner avec des activités - par exemple, vous n'avez pas une bonne façon de gérer les barres d'outils dans plusieurs fragments. Vous n'avez pas de fragment de départ pour le résultat et beaucoup d'autres n'en ont pas. Cela signifie que vous devez réécrire toute la logique qui existe déjà. Qu'en est-il des récepteurs de diffusion locaux, des services et des autres composants Android. Pour démarrer un service, vous devez faire ce qui suit: getActivity ()! = Null ... c'est vraiment moche. La communication entre fragments est également très étrange si vous avez beaucoup de fr.
Teodor
9
700 lignes !!!! "bien"???? Les cours sont gratuits.
beplaya
16

Tout d'abord, quoi que vous fassiez, assurez-vous d'avoir une conception modulaire utilisant un modèle, une vue, un présentateur qui ne dépend pas fortement d'une activité ou d'un fragment.

Que fournissent réellement les activités et les fragments?

  1. Événements du cycle de vie et backstack
  2. Contexte et ressources

Par conséquent, utilisez-les UNIQUEMENT pour cela . Ils ont suffisamment de responsabilités, ne les compliquez pas trop. Je dirais que même introduire un TextView dans une activité ou un fragment est une mauvaise pratique. Il y a une raison pour laquelle des méthodes telles que Public View findViewById (int id) sont PUBLIC .

Maintenant, la question devient plus simple: ai-je besoin de plusieurs événements et backstacks indépendants du cycle de vie? Si vous pensez que oui peut-être, utilisez des fragments. Si vous ne pensez jamais jamais, n'utilisez pas de fragments.

En fin de compte, vous pouvez créer votre propre backstack et cycles de vie. Mais pourquoi recréer la roue?

EDIT: Pourquoi voter contre cela? Gens de classes à but unique! Chaque activité ou fragment doit pouvoir instancier un présentateur qui instancie une vue. Le présentateur et la vue sont un module qui peut être interchangé. Pourquoi une activité ou un fragment devrait-il avoir la responsabilité d'un présentateur?

beplaya
la source
Hm ... le lien entre l'instanciation d'une vue est une mauvaise pratique et findViewById () public n'est pas clair. Bien que je sois d'accord sur l'instanciation des vues, je considère également que l'appel de findViewById depuis une autre classe (par exemple, l'activité hébergeant un fragment l'appelle sur le fragment) est une mauvaise pratique. Je ne sais pas vraiment pourquoi c'est public, car, du moins dans les cas auxquels je peux penser, cela entraîne un code désordonné et non une conception modulaire.
Ixx
IMHO: Si vous passez une activité dans votre vue et présentateur (appelant les 2 combinés un "module"), vous permettez la réutilisation de ce module avec d'autres activités. Si cela aide, il peut être préférable de faire passer l'activité comme une intrigue qui expose uniquement les problèmes nécesaires. Si vous détestez trouver des vues en dehors de l'activité, alors vous pouvez injecter toutes les vues, via cette intrface, dans la vue / vue. le point principal est que je pense que le codage Android devrait être fait en dehors du concept d'Actvities and Frags, de sorte qu'il est facile de basculer entre les 2, puis il devient clair ce qui est bst et vous n'êtes pas coincé avec l'un ou l'autre à l'intérieur d'un réseau de code.
beplaya
3
Lâchez le MVP, vous serez mieux sans Android. Vous pouvez passer beaucoup de temps à essayer de faire passer un certain bloc de forme à travers un trou de forme différente, bien sûr, c'est un défi, mais il y a probablement des exigences fonctionnelles sur lesquelles vous seriez plus sage de passer du temps.
straya
12

Avantages

Vous pouvez contrôler vos fragments à partir d'une seule activité, car tous les fragments sont indépendants les uns des autres. Les fragments ont un cycle de vie ( onPause, onCreate, onStart...) de leur propre. En ayant un cycle de vie, les fragments peuvent répondre indépendamment aux événements, enregistrer leur état onSaveInstanceStateet être ramenés (par exemple lors de la reprise après un appel entrant ou lorsque l'utilisateur clique sur le bouton retour).

Les inconvénients

  1. Créez de la complexité dans votre code d'activité.
  2. Vous devez gérer l'ordre des fragments.

Néanmoins, c'est une très bonne idée, comme si vous deviez créer une application, dans laquelle vous souhaitez afficher plusieurs vues. Grâce à cette idée, vous serez en mesure de visualiser plusieurs fragments dans une seule vue.

Sahil Mahajan Mj
la source
2

Cela dépend de la disposition de conception de votre application. Supposons que si vous utilisez des onglets dans ActionBar dans la mise en page de conception, dans l'activité unique de l'application, des fragments peuvent être modifiés lors d'un clic sur l'onglet. Alors maintenant, vous avez une activité et supposons que trois onglets dans l'ActionBar et la vue des onglets fournis par les fragments, ce qui le rend facile à gérer, est également faisable. Donc, tout dépend du schéma de conception de votre application et de la manière dont vous prenez la décision de la créer.

CENDRE
la source
1

Avantages:

  • Peut être utilisé pour créer une interface unique utilisable par plusieurs tailles d'écran et orientations via des mises en page XML.

Les inconvénients:

  • Nécessite un code plus complexe dans votre activité.

Je pense que c'est une bonne idée, car l'utilisation de différentes mises en page XML en fonction de la taille et de l'orientation actuelles de l'écran peut rendre l'application plus utilisable et réduire le besoin de publier plusieurs versions de votre application si vous prévoyez de publier votre application pour les téléphones et les tablettes. Si votre application ne sera jamais utilisée par les tablettes et les téléphones, cela ne vaut probablement pas la peine.

Ski
la source
Pour l'orientation, il n'est pas nécessaire d'utiliser différentes mises en page basées sur XML.
Vineet Shukla
@VineetShukla est vrai, mais c'est une option, tout comme l'utilisation de différentes mises en page XML en fonction de la taille de l'écran. Par exemple, l'écran d'accueil de mon téléphone Android a une disposition différente lorsque je l'affiche en orientation paysage par rapport au portrait.
Ski le
0

Je suis partisan du report de toute vue sur l'inflation à des fragments pour offrir une meilleure flexibilité. Par exemple, avoir une seule activité d'atterrissage pour une tablette qui regroupe plusieurs fragments et réutiliser les mêmes fragments sur un téléphone pour afficher un écran par fragment. Cependant, dans la mise en œuvre du téléphone, j'aurais une activité distincte pour chaque écran. Les activités n'auraient pas trop de code car elles s'en remettraient immédiatement à leur homologue fragmenté pour voir l'inflation.

Je pense que c'est une mauvaise idée que la mise en œuvre du téléphone doive passer à une seule activité d'atterrissage lorsque des onglets ou un menu coulissant sont introduits, car la navigation dans les onglets ou les menus se traduit simplement par un écran complètement nouveau.

user1679130
la source
"Je pense que c'est une mauvaise idée que l'implémentation du téléphone doive passer à une seule activité d'atterrissage lorsque des onglets ou un menu coulissant sont introduits, car la navigation par onglets ou menus se traduit simplement par un écran complètement nouveau." -> Ce que vous voulez dire exactement n'est pas compréhensible, mais ni les onglets ni le menu latéral ne posent problème dans une application à activité unique (tablette / téléphone).
Ixx
-1

La raison la plus importante que je donnerais pour ne pas utiliser l'approche par activité unique est de tirer parti du cycle de vie de l'activité. Les activités contiennent le comportement contextuel d'une certaine partie de l'application et des fragments complètent ce comportement. Avoir la possibilité de tirer parti des étapes remplaçables du cycle de vie de l'activité permet de séparer le comportement d'une activité d'une autre avec des méthodes telles que onPauseet onResume. Ce cycle de vie vous permet également de revenir au contexte précédent. Avec l'approche par activité unique, une fois que vous laissez un fragment, vous devez créer un mécanisme pour y revenir.

japino
la source
4
Je ne crois pas que ce soit vrai. Extrait de la documentation sur le cycle de vie du fragment ( developer.android.com/guide/components/fragments.html#Lifecycle ): "Le cycle de vie de l'activité dans laquelle vit le fragment affecte directement le cycle de vie du fragment, de sorte que chaque rappel de cycle de vie pour l'activité entraîne un rappel similaire pour chaque fragment. Par exemple, lorsque l'activité reçoit onPause (), chaque fragment de l'activité reçoit onPause (). "
Ski