70 votes

Fragmenter ou ne pas fragmenter - Fragments imbriqués contre des activités. Pourquoi devrais-je utiliser plus d'une activité?

Il y a beaucoup de discussions quant à savoir si vous devez utiliser Activities ou Fragments. Par exemple:

La plupart des discussions que j'ai trouvé ont été libérés avant d'Android 4.2.
Avec Android 4.2 Google a inventé imbriquée Fragments.

Donc en fait je ne vois pas de raison de plus d'utiliser plus d'un Activity.

Dans le stade précoce de Fragments qu'ils étaient censés pour l'utilisation dans des Applications pour soutenir les Tablettes et les Smartphones d'une manière confortable en même temps.

Ainsi, par exemple, vous avez un ListView qui peut ouvrir un détail View sur cliquez sur un élément. Sur un Smartphone, nous remplacerait l' ListView et de montrer l'détaillée View à la place. Alors qu'une Tablette au lieu de remplacer la Liste avec la Vue de détail peut montrer à la fois Views dans le même temps.


Maintenant avec imbriqué Fragments il y a beaucoup d'autres possibilités. Dans le cas où vous souhaitez utiliser un seul Activity, vous pouvez stocker de l'information générale dans l' Activity et chaque Fragment auraient accès.

En outre, Fragments qui ont niché Fragments, pourrait également stocker des informations pour leurs enfants Fragments.

Avec Fragments je peux réutiliser facilement les Views, je peux vous en montrer plus d'un Fragment dans le même temps, et je peux facilement la forme d'une boîte de dialogue d'un Fragment. Tout cela me prendrait probablement pas plus que juste un copier-coller d'actions.

Si j'utilise Activities au lieu de cela j'ai sérieusement de changer beaucoup de choses pour obtenir ce fait.


J'ai récemment mis en place une Application où j'ai pu facilement utiliser deux Fragment-ViewPager pour obtenir des choses vraiment belle et dynamique (une sorte de: l'Information d'aujourd'Hui - Hier de l'Information). À mon avis, Fragments faire notre vie beaucoup plus facile :)


Questions:

  • Pourquoi devrais-je utiliser plus d'un Activity?

Pourriez-vous fournir tout bon exemple dans lequel l'utilisation de plusieurs Activities a plus de sens au lieu d'utiliser Fragments?

  • Existe-il des bons exemples de cas où vous n'avez pas le choix mais pour utiliser Activities?

Je pense que la plupart des grands cadres comme Maps, YouTube et co prennent déjà en charge Fragments. Donc, nous n'avons pas à compter sur Activities. Aussi est-il assez facile de composer avec NavigationBar, TabHosts, ViewPager, ActionBar dans le cas où vous utilisez Fragments.

97voto

Steven Points 520

Tout d'abord, je suis d'accord avec vous qu'il est possible d'écrire une énorme application à l'aide d'une seule activité et imbriqués de fragments. C'est le fun le logiciel, vous pouvez obtenir la même fonctionnalité en utilisant une variété d'approches. Pour moi, le choix d'utiliser de multiples activités en revient à mes préférences personnelles pour l'encapsulation, la réutilisation et la testabilité.

Si j'ai un widget qui peut être réutilisé dans d'autres applications, je me fais un Fragment. Par exemple, mon application dispose d'une "synchronisation avec le serveur" et j'ai créé un custom Fragment qui utilise des Barres de Progression pour afficher visuellement le processus de synchronisation. Il est facile d'imaginer une autre application, de pouvoir utiliser ce widget, c'est pourquoi j'ai développé comme un Fragment.

Si je suis la commutation de tâches au sein de mon application, tels que la nouvelle tâche est théoriquement indépendante de la tâche précédente, puis-je utiliser une nouvelle activité. Par exemple, la première page de mon application vous demande de sélectionner un utilisateur. Une fois que vous avez cliqué sur un utilisateur, je vous envoie le menu principal de l'utilisateur. Ce menu principal de l'utilisateur est affiché dans une nouvelle activité.

Imaginons maintenant un grand, complexe app, et une équipe de développeurs de cette application. Si l'application peut être divisée en deux activités distinctes, il est conceptuellement très facile de diviser les tâches. Chaque activité est son propre bac à sable, de sorte que le développement parallèle est simple et unité-testable. S'il y a des besoins communs, l'équipe doit encore se développer des Fragments et de les réutiliser, bien sûr. Je dois ajouter que la réutilisation de code n'arrive pas assez souvent dans le développement de logiciels, mais si c'est bien fait, il devrait y avoir beaucoup de réutilisables Fragments.

Supposons maintenant il est temps de tester l'application. Votre équipe de test peut traiter chaque activité comme sa propre boîte noire. C'est plus facile de tester qu'un seul énorme application qui s'appuie sur une seule activité et des tonnes d'imbrication des fragments. Ceci est particulièrement important si il existe un bogue. Si il existe un bogue qui n'est pas évident, au moins je sais que le champ d'application de la bogue est limitée à une seule activité de beaucoup de.

En résumé, je pense que vous développez votre application en tant qu'individu, et donc de votre développement décisions n'affectent pas tout le monde. De votre point de vue serait susceptible de changer si vous développez une application avec une équipe plus importante, et j'espère que ma réponse fait beaucoup de sens dans ce contexte.

2voto

Sherif elKhatib Points 23987

Vous êtes de droite. On pourrait faire beaucoup avec des fragments seul. Toutefois, en fonction de l' Activité de classe, une activité est un simple, ciblée chose que l'utilisateur peut faire. J'ai toujours tendance à compartimenter ma demande en activités au plus haut niveau et de plus en fragments.

Par exemple, voici une situation où de multiples activités à faire sens. Nos applications a un certain nombre de fonctionnalités qui peut être prolongée si l'utilisateur se connecte. Toutefois, l'utilisateur peut toujours utiliser cette fonctionnalité limitée avant de signer. Dites, vous ne pouvez pas commenter les articles, sauf lorsque vous êtes connecté. Dans ce cas, notre MainActivity de montrer qu'un ensemble de fonctionnalités. Si l'utilisateur souhaite commentaire, nous lui demandons de connexion par l'économie de sa demande et le démarrage d'une activité LoginActivity qui gère la connexion/inscription et définit le bon résultat quand il est fait. Dans notre appel Fragment ou d'une Activité, on vérifie si le résultat est LOGIN_SUCCESS ou si l'utilisateur est actuellement connecté et de servir la demande en attente. Ce que j'essaie de dire, c'est que l'action de débit de la Connexion doit être une activité distincte. Sinon, la manipulation serait probablement foiré. De cette manière, toute action qui nécessite un nom d'utilisateur peut appeler startActivityForResult(LOGIN) et enregistre lui-même comme un pendingAction. Puis après le réglage du résultat que nous pouvions mettre en œuvre la manutention dans le super.onActivityResult. Tout ceci est théorique bien sûr, on pourrait mettre en œuvre de Connexion dans un fragment sans trop de mal. Toutefois, le code va certainement être FUed.

Une autre situation où vous avez besoin d'une Activité, c'est quand votre activité fournit une exporté Service. Par exemple, disons que vous êtes un développeur d'un "Fichier Uploader" et vous recevez les intentions de téléchargement de fichiers. Il est très pratique dans ce cas de créer une Activité qui peut consommer de la demande de téléchargement d'un fichier.

Pourtant, avec les mises à jour actuelles, des Fragments de fonctionnement durée de la plupart des fonctionnalités d'applications android et peut donc être utilisé seul avec un seul hôte de l'activité pour satisfaire aux exigences d'une application.

Cependant, l'ensemble de votre "une seule activité d'accueil" avec les données, il est plutôt une faiblesse de la défense. Activités et étroitement Fragments de l'ensemble du cycle de vie, qui comprennent les sauvegarder/restaurer exemple par le biais de faisceaux. Une seule activité de l'hôte peuvent être de longue durée et de l'hôte de plusieurs fragments qui peuvent être recyclés plusieurs fois dans un même durée de vie de leur activité. Il est donc très probable qu'une activité de holding tous ces cas, plus de temps pour dépasser son budget de ressources. Il est de la responsabilité du développeur de conserver les données dans un contexte partagé quand ils sont vraiment partagés entre plusieurs objets. C'est un inconvénient de cette approche. Il ne fait pas de sens dans notre exemple, pour le MainActivity à consommer de l'octet de données parce qu'il a accueilli la Connexion des fragments quand elle pourrait avoir dormi et s'est libéré de sa mémoire si nécessaire.

En fin de compte, un bon programmeur peut réussir à faire la même tâche de la même manière.

2voto

Alex Tran Points 739

Vous avez entièrement raison!

Pourquoi devrais-je utiliser plus d'une Activité?

Pourriez-vous fournir tout bon exemple dans lequel l'utilisation de multiples Activités, plus de sens au lieu d'utiliser des Fragments?

Existe-il des bons exemples de cas où vous n'avez pas le choix mais pour les Activités d'utilisation?

Je pense que la plupart des grands cadres comme Maps, YouTube et co déjà le soutien des Fragments. Donc, nous n'avons pas à compter sur les Activités. Aussi est-il assez facile de composer avec NavigationBar, TabHosts, ViewPager, ActionBar dans le cas où vous utilisez des Fragments.

Toujours à l'aide de Fragments n'est pas bon pour gonfler les données de l'INTERFACE utilisateur, notamment en cas

  • ConnectionTimeOut (faible ou internet) depuis qu'il a pris beaucoup de temps pour initialiser les données. Donc, parfois à l'aide de chaque activité pour gonfler quelques données, c'est mieux que chaque fragment.

  • Ou pour l'utilisation de la méthode onActivityResult pour plus de flexibilité, à l'aide de l'activité est aussi mieux que. Ex. Vous pouvez appeler FileDialogChooser dans votre application.

Que dans certains cas,

Merci,

1voto

phemt.latd Points 1096

Pour vos questions, je peux seulement dire que, parfois, avec un complexe d'Expérience Utilisateur ou complexes application qui doit utiliser un autre composant matériel vous devez utiliser de l'activité à la place du fragment.

Par exemple, si vous devez créer une application avec une forme qui ont un pas que prendre une photo et ensuite utiliser cette photo pour travailler un peu difficile tâche de mémoire ( détection de visage par exemple ) que l'utilisation de la mémoire vous avez besoin de séparer cette tâche de la tâche principale de l'activité et de personnaliser l'autorisation de manifester à utiliser plus de mémoire que sur cette activité.

Un autre exemple est si vous voulez utiliser la faiblesse de l'activité de la mémoire ( dans le manifeste, vous pouvez définir les propriétés que l'claire de l'activité de la pile et la force de le Garbage Collector pour nettoyer la mémoire lors de l'activité de finition )

Le plus probable de la situation qui nécessite l'utilisation de plus d'activité et le fragment est l'Expérience de l'Utilisateur de l'application. Si vous avez besoin d'un droit de tiroir personnalisé qui contient un menu et chaque fragment de ce menu contient une liste et chaque affichage de la liste doit aller dans le détail. Vous pouvez faire beaucoup de truc pour cacher le droit de tiroir et de créer une animation à glisser d'un fragment du détail, mais le meilleur et le plus simple est de faire une nouvelle activité pour le détail et la gérer avec une autre logique/cycle de vie de l'activité principale, avec le tiroir. J'ai fait ce choisir dans deux de mes applications:

iMeal - https://play.google.com/store/apps/details?id=it.fullsix.chiccopappe

GGRugby - https://play.google.com/store/apps/details?id=it.f6.template

Dans cette application, le Tiroir est dans la Principale Fragment d'Activité, de chaque menu modifier le fragment de contenu. La vue liste dans le fragment de contenu de changement de contexte d'activité avec l'intention et aller dans une autre activité.

Enfin, il y a une situation que je pense que vous devriez travailler avec plus qu'un seul fragmentActivity...mais c'est une de mes habitudes de travail, probablement, vous pouvez trouver une astuce/ou de la portée de faire quelque chose avec seulement une Activité et le fragment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X