[android] Dilemme: quand utiliser Fragments vs Activités:


Answers

Ma philosophie est la suivante:

Créez une activité seulement si c'est absolument nécessaire. Avec le backstack disponible pour commettre des transactions de fragment, je tente de créer le minimum d'activités dans mon application que possible. En outre, la communication entre divers fragments est beaucoup plus facile plutôt que d'envoyer des données entre les activités.

Les transitions d'activité sont chères, non? Au moins, je le crois - puisque l'ancienne activité doit être détruite / mise en pause / arrêtée, poussée sur la pile et ensuite la nouvelle activité doit être créée / démarrée / reprise.

C'est juste ma philosophie puisque des fragments ont été introduits.

Question

Je sais que les Activities sont conçues pour représenter un seul écran de mon application, tandis que les Fragments sont conçus pour être des mises en page UI réutilisables avec une logique intégrée à l'intérieur d'eux.

Il n'y a pas si longtemps, j'ai développé une application qui disait qu'ils devaient être développés. J'ai créé une Activity pour représenter un écran de mon application et utilisé des fragments pour ViewPager ou Google Maps . J'ai rarement créé un ListFragment ou une autre interface utilisateur qui peut être réutilisée plusieurs fois.

Récemment, je suis tombé sur un projet qui contient seulement 2 Activities une est une SettingsActivity et l'autre est MainActivity . La disposition de MainActivity est remplie avec de nombreux fragments d'interface utilisateur cachés en plein écran 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é de cette approche est que, parce que l'application utilise un ActionBar , elle reste intacte et ne bouge pas avec l'animation de commutation d'écran, ce qui est le cas avec le changement d' 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 sur ce sujet, je sais que ça pourrait ressembler à une question basée sur l'opinion au premier abord mais je la considère comme une question de design et d'architecture Android ... basé sur l'opinion.

MISE À JOUR (01.05.2014): Suite à cette présentation par Eric Burke de Square , (que je dois dire est une excellente présentation avec beaucoup d'outils utiles pour les développeurs Android. Et je ne suis pas du tout lié à Square)

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

De mon expérience personnelle au cours des derniers mois, j'ai trouvé que la meilleure façon de construire mes applications est de créer des groupes de fragments qui viennent représenter un flux dans l'application et présenter tous ces fragments en une seule Activity . Donc, fondamentalement, vous aurez le même nombre d' Activities dans votre application que le nombre de flux. De cette façon, la barre d'action reste intacte sur tous les écrans du flux, mais elle est recréée en changeant un flux qui a beaucoup de sens. Comme l'affirme Eric Burke et comme je me suis rendu compte également, la philosophie consistant à utiliser le moins d' Activities possibles n'est pas applicable à toutes les situations car cela crée un désordre dans ce qu'il appelle l'activité «Dieu».




utiliser une activité par application pour fournir une base pour fragment utilisation de fragment pour l'écran, les fragments sont légers par rapport aux fragments d' activites sont des fragments réutilisables sont mieux adaptés pour l'application qui supporte à la fois le téléphone et la tablette




J'utilise Fragments pour une meilleure expérience utilisateur. Par exemple, si vous avez un bouton et que vous voulez exécuter disons un service Web lorsque vous cliquez dessus, j'attache un fragment à l'activité parente.

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 d'autre part, je préfère les Fragments parce que vous pouvez les manipuler facilement pendant la rotation.




Ce que j'ai fait: Utiliser moins de fragments quand c'est possible. Malheureusement, c'est possible dans presque tous les cas. Donc, je me retrouve avec beaucoup de fragments et un peu d'activités. Quelques inconvénients que j'ai réalisés:

  • ActionBar & Menu: Quand 2 fragment a un titre différent, un menu,
    sera difficile à gérer. Ex: lors de l'ajout d'un nouveau fragment, vous pouvez changer le titre de la barre d'action, mais lorsque vous l' backstack du backstack il n'y a aucun moyen de restaurer l'ancien titre. Vous pouvez avoir besoin d'une barre d'outils dans chaque fragment pour ce cas, mais laissez-moi croire, cela vous prendra plus de temps.
  • Lorsque nous avons besoin de startForResult , l'activité n'a pas de fragment.
  • Ne pas avoir d'animation de transition par défaut

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




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

  1. à quelle fréquence allez-vous réutiliser des parties de l'interface utilisateur (menus par exemple),
  2. est l'application aussi pour les tablettes?

L'utilisation principale de fragments est de construire des activités multipaires, ce qui le rend parfait pour les applications sensibles aux tablettes / téléphones.




Pourquoi je préfère Fragment plutôt que Activité dans TOUS LES CAS.

  • L'activité est chère. Dans Fragment, les vues et les états de propriété sont séparés: chaque fois qu'un fragment se trouve dans le backstack , ses vues sont détruites. Vous pouvez donc empiler plus de Fragments que d'Activité.

  • Backstack manipulation de Backstack . Avec FragmentManager , il est facile d'effacer tous les Fragments, d'en insérer plus que sur les Fragments et etc. Mais pour Activity, ce sera un cauchemar de manipuler ces choses.

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




Je pense que l'utilisation de fragments est préférable à l'utilisation d'activités, mais il est difficile de gérer le bouton de pile arrière en utilisant frament




Related