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".
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.
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.
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.
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. AvecFragmentManager
, 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é).
à mon avis, ce n'est pas vraiment pertinent. Le facteur clé à considérer est
- combien de fois allez-vous réutiliser des parties de L'UI (menus par exemple),
- 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.
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.
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.
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 debackstack
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,...
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.
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.
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.
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
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.