Dilemme: quand utiliser les Fragments par rapport aux activités:

je sais que Activities sont conçus pour représenter un seul écran de ma demande, tandis que Fragments sont conçus pour être réutilisables layouts UI avec logique intégrée à l'intérieur d'eux.

Jusqu'à il n'y a pas si longtemps, j'ai développé une application qui disait qu'il fallait les développer. J'ai créé un Activity pour représenter un écran de mon application et j'ai utilisé des Fragments pour ViewPager ou Google Maps . J'ai rarement créé un ListFragment ou D'autres UI qui peuvent être réutilisé plusieurs fois.

récemment je suis tombé sur un projet qui contient seulement 2 Activities un est un SettingsActivity et l'autre est le MainActivity . La mise en page du MainActivity est peuplée de nombreux fragments D'interface utilisateur plein écran cachés et un seul est affiché. Dans la logique Acitivty il y a beaucoup de FragmentTransitions entre les différents écrans de l'application.

ce que j'ai aimé dans cette approche est que parce que l'application utilise un ActionBar , il reste intact et ne bouge pas avec l'animation de commutation d'écran, ce qui est ce qui se passe avec la commutation Activity . Cela donne une sensation plus fluide à ces transitions d'écran.

donc je suppose que ce que je demande est de partager votre mode de développement actuel en ce qui concerne ce sujet, je sais qu'il pourrait ressembler à une question basée sur l'opinion à première vue, mais je le regarde comme un design Android et l'architecture question... Pas vraiment basé sur une opinion.

mise à jour (01.05.2014): suite à cette présentation par Eric Burke de carré , (qui je dois dire est une grande présentation avec beaucoup d'outils utiles pour les développeurs android. Et je ne suis pas liés en aucune façon à Carré)

http://www.infoq.com/presentations/Android-Design /

D'après mon expérience personnelle ces derniers mois, j'ai trouvé que la meilleure façon de construire mes applications est de créer des groupes de fragments qui viennent de représenter un flux dans l'application et de présenter tous ces fragments en un Activity . Donc, fondamentalement, vous aurez le même nombre de Activities dans votre application comme le nombre de flux. De cette façon, la barre d'action reste intacte sur tous les écrans du flux, mais est recréée en changeant un flux qui fait beaucoup de sens. Comme le dit Eric Burke et comme je l'ai réalisé aussi, la philosophie d'utiliser aussi peu que possible Activities n'est pas applicable à toutes les situations parce qu'elle crée un désordre dans ce qu'il appelle l'activité" Dieu".

670
demandé sur Henry 2013-12-01 01:53:00

13 réponses

les Experts vous diront: "quand je vois L'UI, je saurai s'il faut utiliser un Activity ou un Fragment ". Au début, cela n'aura aucun sens, mais avec le temps, vous pourrez dire si vous avez besoin de Fragment ou non.

il y a une bonne pratique que j'ai trouvé très utile pour moi. Il m'est apparu alors que j'essayais d'expliquer quelque chose à ma fille.

à savoir, imaginez une boîte qui représente un écran. Pouvez-vous charger un autre écran dans cette boîte? Si vous utilisez une nouvelle boîte, devrez-vous copier plusieurs articles de la première boîte? Si la réponse est oui, alors vous devez utiliser Fragments , parce que la racine Activity peut contenir tous les éléments dupliqués pour vous faire gagner du temps dans leur création, et vous pouvez simplement remplacer des parties de la boîte.

mais n'oubliez pas que vous avez toujours besoin d'un conteneur ( Activity ) ou vos pièces seront dispersées. Donc, une boîte avec des pièces à l'intérieur.

veillez à ne pas abuser de la boîte. Les experts D'Android UX conseillent (vous pouvez les trouver sur YouTube) quand nous devrions charger explicitement un autre Activity , au lieu d'utiliser un Fragment (comme quand nous traitons avec le tiroir de Navigation qui a des catégories). Une fois que vous vous sentez à l'aise avec Fragments , vous pouvez regarder toutes leurs vidéos. Même plus, ils sont obligatoires matériel.

pouvez-vous maintenant regarder votre UI et de comprendre si vous avez besoin d'un Activity ou un Fragment ? Avez-vous un nouveau point de vue? Je pense que vous avez fait.

226
répondu sandalone 2017-02-26 15:48:55

ma philosophie est celle-ci:

ne Créer une activité que si elle est absolument nécessaire. Avec le backstack mis à disposition pour commettre un tas de transactions de fragments, j'essaie de créer un minimum d'activités dans mon application que possible. De plus, il est beaucoup plus facile de communiquer entre divers fragments plutôt que d'envoyer des données d'une activité à l'autre.

les transitions D'activité sont chères, non? Au moins je le crois - depuis le ancienne activité à détruire/arrêter/arrêter, poussée sur la pile et puis la nouvelle activité doit être créée/commencée / reprise.

c'est juste ma philosophie depuis que les fragments ont été introduits.

103
répondu VJ Vélan Solutions 2015-02-02 05:25:30

Eh bien , selon les cours de Google (peut-être ici , Je ne me souviens pas), vous devriez envisager D'utiliser des Fragments chaque fois que c'est possible, car il rend votre code plus facile à maintenir et à contrôler.

cependant, je pense que dans certains cas, cela peut devenir trop complexe, car l'activité qui héberge les fragments doit naviguer/communiquer entre eux.

je pense que vous devriez décider par vous-même ce qui est le mieux pour vous. Il n'est généralement pas si difficile de convertir une activité en fragment et vice versa.

j'ai créé un billet sur ce dillema ici , si vous souhaitez en lire plus.

49
répondu android developer 2017-05-23 12:34:37

pourquoi je préfère le Fragment à L'activité dans tous les cas.

  • L'activité est coûteuse. Dans Fragment, les vues et les états de propriété sont séparés - chaque fois qu'un fragment est dans backstack , ses vues seront détruites. Donc vous pouvez empiler beaucoup plus de Fragments que D'activité.

  • Backstack la manipulation. Avec FragmentManager , il est facile de nettoyer tous les Fragments, insérer plus que sur les Fragments et etcs. Mais pour l'Activité, ce sera un cauchemar pour manipuler ces trucs.

  • beaucoup prévisible cycle de vie . Tant que l'activité hôte n'est pas recyclée. les Fragments dans le dos ne seront pas recyclés. Il est donc possible d'utiliser FragmentManager::getFragments() pour trouver un Fragment spécifique (non encouragé).

21
répondu Qylin 2016-12-29 03:13:08

à mon avis, ce n'est pas vraiment pertinent. Le facteur clé à considérer est

  1. combien de fois allez-vous réutiliser des parties de L'UI (menus par exemple),
  2. est l'application aussi pour les comprimés?

l'utilisation principale de fragments est de construire des activités multipane, ce qui le rend parfait pour les applications sensibles tablette/téléphone.

10
répondu Isaac Urbina 2016-12-29 03:12:44

il y a plus que ce que vous réalisez, vous devez vous rappeler qu'une activité qui est lancée ne détruit pas implicitement l'activité appelant. Bien sûr, vous pouvez le configurer de sorte que votre utilisateur clique sur un bouton pour aller à une page, vous démarrez l'activité de cette page et de détruire l'actuelle. Cela entraîne beaucoup de frais généraux. Le meilleur guide que je puisse vous donner est:

* * démarrer une nouvelle activité seulement s'il est logique d'avoir l'activité principale et celle-ci ouverte en même temps (penser à plusieurs fenêtres).

Google Drive est un bon exemple de ce qui est logique lorsqu'il y a plusieurs activités. L'activité principale fournit un explorateur de fichier. Lorsqu'un fichier est ouvert, une nouvelle activité est lancé pour afficher ce fichier. Vous pouvez appuyer sur le bouton applications récentes qui vous permettra de revenir au navigateur sans fermer le document ouvert, puis peut-être même ouvrir un autre document en parallèle à la première.

8
répondu TheHebrewHammer 2015-08-05 14:27:40

N'oubliez pas qu'une activité est le bloc/composant d'une demande qui peut être partagé et commencé par intention! Ainsi, chaque activité de votre application doit résoudre un seul type de tâche. Si vous n'avez qu'une seule tâche dans votre application, alors je pense que vous avez besoin d'une seule activité et de nombreux fragments si nécessaire. Bien sûr, vous pouvez réutiliser des fragments dans des activités futures qui résolvent d'autres tâches. Cette approche sera une séparation claire et logique des tâches. Et vous n'avez besoin de maintenir une activité avec différents paramètres de filtre d'intention pour différents ensembles de fragments. Vous définissez les tâches au stade de la conception du processus de développement en fonction des exigences.

7
répondu guest 2015-02-02 16:57:35

chose que j'ai fait: utiliser moins de fragments quand c'est possible. Malheureusement, c'est possible dans presque cas. Donc, je finis avec beaucoup de fragments et un peu d'activités. Je me suis rendu compte de certains inconvénients:

  • ActionBar & Menu: Quand 2 fragment a un titre différent, menu, que

    sera difficile à gérer. Ex: lors de l'ajout d'un nouveau fragment, vous pouvez changer le titre de la barre d'action, mais quand pop il de backstack il n'y a aucun moyen de restaurer l'ancien intitulé. Vous pouvez avoir besoin d'une barre D'outils dans chaque fragment pour cette affaire, mais laissez-moi croire, qui vous passerez plus de temps.
  • quand on a besoin de startForResult , l'activité a mais pas le fragment.
  • ne pas avoir d'animation de transition par défaut

ma solution pour cela est d'utiliser une activité pour envelopper un fragment à l'intérieur. Nous avons donc une barre d'action séparée, menu, startActivityForResult , animation,...

7
répondu I Love Coding 2016-12-29 03:14:32

le grand avantage d'un fragment par rapport à l'activité est que le code utilisé pour les fragments peut être utilisé pour différentes activités.ainsi, il fournit réutilisable de code dans le développement d'application.

3
répondu Sanchit Bhasin 2016-12-29 03:12:18

j'utilise des Fragments pour une meilleure expérience utilisateur. Par exemple, si vous avez un Bouton et que vous souhaitez exécuter disons un service web lorsque vous cliquez dessus, j'attache un Fragment de l'Activité parent.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

De cette façon, l'utilisateur n'aura pas à se déplacer dans une autre activité.

et deuxièmement je préfère les Fragments parce que vous pouvez les manipuler facilement pendant la rotation.

1
répondu Theo 2016-11-28 19:00:24

Cela dépend de ce que vous voulez construire vraiment. Par exemple le navigation drawer utilise des fragments. Les onglets utilisent aussi fragments . Une autre bonne mise en œuvre,est où vous avez un listview . Lorsque vous faites pivoter le téléphone et cliquez sur une ligne, l'activité est montré dans l'autre moitié de l'écran. Personnellement ,j'utilise fragments et fragment dialogs , car c'est plus professionnel. De plus, ils sont manipulés plus facilement en rotation.

1
répondu Theo 2016-12-29 03:07:58

utiliser une activité par application pour fournir une base pour fragment utilisez fragment pour l'écran , fragments sont poids léger par rapport à activites les fragments sont réutilisable les fragments sont mieux adapté pour l'application qui soutiennent à la fois le téléphone et la tablette

1
répondu varg 2016-12-29 03:08:41

vous êtes libre d'en utiliser un.

Fondamentalement, vous devez évaluer qui est le meilleur pour votre application. Pensez à la façon dont vous allez gérer le flux d'affaires et comment stocker/gérer les préférences de données.

pensez à la façon dont les Fragments emmagasinent les données sur les ordures. Lorsque vous implémentez le fragment, vous avez une racine d'activité à remplir avec le(s) fragment (s). Donc, si vous essayez de mettre en œuvre beaucoup d'activités avec trop de fragments, vous devez considérer performance sur votre application, car vous manipulez (grossièrement parle) deux cycle de vie de contexte, rappelez-vous la complexité.

rappelez - vous: dois-je utiliser des fragments? Pourquoi ne devrais-je pas?

cordialement.

1
répondu Franklin Hirata 2017-09-28 23:19:03