Android – J’ai besoin de clarifications de fragments vs activités et vues

Dans Android API 11+, Google a publié une nouvelle classe appelée Fragment .

Dans les vidéos, Google suggère que chaque fois que possible ( link1 , link2 ), nous devrions utiliser des fragments plutôt que des activités, mais ils n’expliquent pas exactement pourquoi.

Quel est le but des fragments et de leurs utilisations possibles (autres que certains exemples d’interface utilisateur pouvant être facilement atteints par de simples vues / mises en page)?

Ma question concerne les fragments:

  1. Quels sont les buts de l’utilisation d’un fragment?
  2. Quels sont les avantages et les inconvénients de l’utilisation de fragments par rapport à l’utilisation d’activités / de vues / de mises en page?

Questions bonus:

  1. Pouvez-vous donner des utilisations vraiment intéressantes pour des fragments? Des choses que Google n’a pas mentionnées dans leurs vidéos?
  2. Quelle est la meilleure façon de communiquer entre les fragments et les activités qui les contiennent?
  3. Quelles sont les choses les plus importantes à retenir lorsque vous utilisez des fragments? Des conseils et des avertissements de votre expérience?

# 1 & # 2 Quels sont les objectives de l’utilisation d’un fragment? Quels sont les avantages et les inconvénients de l’utilisation de fragments par rapport à l’utilisation d’activités / de vues / de mises en page?

Les fragments sont la solution d’Android pour créer des interfaces utilisateur réutilisables. Vous pouvez réaliser certaines des mêmes choses en utilisant des activités et des mises en page (par exemple en utilisant include). Toutefois; Les fragments sont connectés à l’API Android, à partir de HoneyComb, et plus encore. Laissez-moi élaborer;

  • La ActionBar . Si vous souhaitez que les tabs là-bas parcourent votre application, vous voyez rapidement que l’interface ActionBar.TabListener vous donne une FragmentTransaction tant qu’argument d’entrée de la méthode onTabSelected . Vous pourriez probablement ignorer cela, et faire autre chose et intelligent, mais vous travailleriez contre l’API, pas avec elle.

  • Le FragmentManager gère “back” pour vous de manière très intelligente. Retour ne signifie pas revenir à la dernière activité, comme pour les activités régulières. Cela signifie revenir à l’état de fragment précédent.

  • Vous pouvez utiliser le cool ViewPager avec un FragmentPagerAdapter pour créer des interfaces de balayage. Le code FragmentPagerAdapter est beaucoup plus propre qu’un adaptateur standard et contrôle les instanciations des fragments individuels.

  • Votre vie sera beaucoup plus facile si vous utilisez Fragments lorsque vous essayez de créer des applications pour les téléphones et les tablettes. Les fragments étant liés aux API Honeycomb +, vous souhaiterez également les utiliser sur les téléphones pour réutiliser le code. C’est là que la bibliothèque de compatibilité est pratique.

  • Vous pourriez même et devriez utiliser des fragments pour des applications destinées uniquement aux téléphones. Si vous avez en tête la portabilité. J’utilise ActionBarSherlock et les bibliothèques de compatibilité pour créer des applications “à la recherche d’ICS”, qui se ressemblent depuis la version 1.6. Vous obtenez les dernières fonctionnalités telles que la barre d’action, avec des tabs, un débordement, une barre d’action divisée, un viewpager, etc.

Bonus 2

La meilleure façon de communiquer entre les fragments sont les intentions. Lorsque vous appuyez sur quelque chose dans un fragment, vous appelez généralement StartActivity() avec des données. L’intention est transmise à tous les fragments de l’activité que vous lancez.

  1. Le fragment est une partie d’une activité qui apporte sa propre interface utilisateur à cette activité. Le fragment peut être pensé comme une sous-activité. Où l’écran complet avec lequel l’utilisateur interagit est appelé activité. Une activité peut contenir plusieurs fragments. Les fragments sont principalement une partie d’une activité.

  2. Une activité peut contenir 0 ou plusieurs nombres de fragments en fonction de la taille de l’écran. Un fragment peut être réutilisé dans plusieurs activités, il agit donc comme un composant réutilisable dans les activités.

  3. Un fragment ne peut pas exister indépendamment. Cela devrait toujours faire partie d’une activité. Où comme activité peut exister sans aucun fragment en elle.

Vous ne savez pas à quelle (s) vidéo (s) vous faites référence, mais je doute qu’ils disent que vous devriez utiliser des fragments plutôt que des activités, car ils ne sont pas directement interchangeables. Il y a en fait une entrée assez détaillée dans le Guide de développement, pensez à la lire pour plus de détails.

En bref, les fragments vivent dans des activités et chaque activité peut héberger de nombreux fragments. Tout comme les activités, elles ont un cycle de vie spécifique, contrairement aux activités, ce ne sont pas des composants applicatifs de premier niveau. Les avantages des fragments incluent la réutilisation du code et la modularité (par exemple, l’utilisation de la même vue de liste dans de nombreuses activités), notamment la possibilité de créer des interfaces à plusieurs volets (surtout utiles sur les tablettes). Le principal inconvénient est la complexité (en partie). Vous pouvez généralement réaliser la même chose avec des vues (personnalisées) de manière non standard et moins robuste.

Un fragment est un élément de l’interface utilisateur ou du comportement d’une application qui peut être placé dans une activité et qui permet une conception d’activité plus modulaire. Ce ne sera pas faux si nous disons qu’un fragment est une sorte de sous-activité.

Voici quelques points importants concernant un fragment:

  1. Un fragment a sa propre disposition et son propre comportement avec ses propres rappels de cycle de vie.

  2. Vous pouvez append ou supprimer des fragments dans une activité pendant que l’activité est en cours d’exécution.

  3. Vous pouvez combiner plusieurs fragments en une seule activité pour créer une interface utilisateur à plusieurs volets.

  4. Un fragment peut être utilisé dans plusieurs activités.

  5. Le cycle de vie des fragments est étroitement lié au cycle de vie de son activité hôte.

  6. Lorsque l’activité est suspendue, tous les fragments disponibles dans l’activité seront également arrêtés.

  7. Un fragment peut implémenter un comportement sans composant d’interface utilisateur.

  8. Des fragments ont été ajoutés à l’API Android sous Android 3 (Honeycomb) avec la version 11 de l’API.

Pour plus de détails, veuillez visiter le site officiel, Fragments .

Ce sont des informations importantes que j’ai trouvées sur des fragments:

Historiquement, chaque écran d’une application Android était implémenté en tant qu’activité distincte. Cela crée un défi pour la transmission d’informations entre les écrans, car le mécanisme Android Intent ne permet pas de transmettre un type de référence (c’est-à-dire un object) directement entre les activités. Au lieu de cela, l’object doit être sérialisé ou une référence accessible globalement est disponible.

En faisant de chaque écran un fragment séparé, ce mal de passage de données est complètement évité. Les fragments existent toujours dans le contexte d’une activité donnée et peuvent toujours accéder à cette activité. En stockant les informations d’intérêt dans l’activité, le fragment de chaque écran peut simplement accéder à la référence de l’object via l’activité.

Les fragments sont particulièrement utiles dans certains cas, par exemple lorsque nous voulons conserver un tiroir de navigation dans toutes nos pages. Vous pouvez gonfler une mise en page avec le fragment que vous voulez et avoir toujours access au tiroir de navigation.

Si vous aviez utilisé une activité, vous auriez dû garder le tiroir dans toutes les activités, ce qui en fait un code redondant. C’est une utilisation intéressante d’un fragment.

Je suis nouveau sur Android et pense toujours qu’un fragment est utile de cette façon.

Je sais que cela a déjà été discuté à mort, mais j’aimerais append quelques points supplémentaires:

  • Les frags peuvent être utilisés pour remplir Menu s et gérer les clics MenuItem par eux-mêmes. Donnant ainsi d’autres options de modulation pour vos activités. Vous pouvez faire des choses ContextualActionBar et ainsi de suite sans que votre activité le sache et peut essentiellement le dissocier des éléments de base que votre activité gère (Navigation / Paramètres / À propos).

  • Un Frag parent avec des Frags enfants peut vous donner d’autres options pour moduler vos composants. Par exemple, vous pouvez facilement échanger des Frags, mettre de nouvelles Frags dans un Pager ou les supprimer, les réorganiser. Tout cela sans votre activité, sachant que vous ne vous concentrez que sur le niveau supérieur.

Un fragment représente un comportement ou une partie de l’interface utilisateur dans une activité. Vous pouvez combiner plusieurs fragments dans une même activité pour créer une interface utilisateur à plusieurs volets et réutiliser un fragment dans plusieurs activités. Vous pouvez considérer un fragment comme une section modulaire d’une activité, qui possède son propre cycle de vie, reçoit ses propres événements d’entrée et que vous pouvez append ou supprimer pendant l’exécution de l’activité.

  • Vous pouvez manipuler chaque fragment indépendamment, par exemple en les ajoutant ou en les supprimant. Lorsque vous effectuez une transaction de ce type, vous pouvez également l’append à une stack arrière gérée par l’activité – chaque entrée de stack arrière de l’activité est un enregistrement de la transaction de fragment qui s’est produite. La stack arrière permet à l’utilisateur d’inverser une transaction fragmentée (navigation arrière) en appuyant sur le bouton Retour.

  • Lorsque vous ajoutez un fragment dans la disposition de votre activité, il se trouve dans un ViewGroup à l’intérieur de la hiérarchie de vues de l’activité et le fragment définit sa propre disposition de vue. Vous pouvez insérer un fragment dans la disposition de votre activité en déclarant le fragment dans le fichier de mise en forme de l’activité, en tant qu’élément ou à partir de votre code d’application en l’ajoutant à un groupe de vues existant. Cependant, il n’est pas nécessaire qu’un fragment fasse partie de la disposition de l’activité. Vous pouvez également utiliser un fragment sans interface utilisateur spécifique en tant que travailleur invisible pour l’activité.

  • Par exemple: Si vous deviez utiliser NavigationDrawer sans Fragments, il serait préférable de conserver l’instance NavigationDrawer dans une seule activité et lorsque vous naviguez dans l’application en choisissant parmi les éléments de NavigationDrawer, chacune des Activités démarrées ne doit pas implémenter le NavigationDrawer mais à la place devrait implémenter le bouton Précédent pour revenir à l’activité “principale” / unique dans laquelle NavigationDrawer a été implémenté.

    Remarque: Si vous souhaitez implémenter NavigationDrawer dans plusieurs activités, vous devez recréer une nouvelle instance de NavigationDrawer dans chaque activité que vous souhaitez afficher.

    Je suppose que cela serait un inconvénient par rapport à l’utilisation de Fragments alors que si vous utilisiez un fragment, vous n’auriez pas besoin de nombreuses instances du tiroir dont vous n’auriez besoin que d’un seul.

    Tiroir avec fragments au lieu d’activités

    Si vous utilisez NavigationDrawer avec Fragments, le tiroir doit être implémenté dans une seule activité et lorsque chaque élément de tiroir est sélectionné, leur contenu est affiché dans chacun de leurs propres fragments.

  • Communiquer entre fragment à son activité : pour permettre à un fragment de communiquer jusqu’à son activité, vous pouvez définir une interface dans la classe Fragment et l’implémenter dans l’activité. Le fragment capture l’implémentation de l’interface pendant sa méthode de cycle de vie onAttach () appelez les méthodes d’interface pour communiquer avec l’activité.

     public class YourFragment extends ListFragment { OnSelectedListener mCallback; // Container Activity must implement this interface public interface OnSelectedListener { public void onItemSelected(int position); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.your_view, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (OnSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toSsortingng() + " must implement OnSelectedListener"); } } }... 

Le fragment peut désormais envoyer des messages à l’activité en appelant la méthode onItemSelected () (ou d’autres méthodes de l’interface) à l’aide de l’instance mCallback de l’interface OnSelectedListener.

 public static class MainActivity extends Activity implements YourFragment.OnSelectedListener{ ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); } public void onItemSelected(int position) { // The user selected the headline of an article from the YourFragment // Do something here to display that article YourFragment yourFrag = (YourFragment) getSupportFragmentManager().findFragmentById(R.id.your_fragment); if (yourFrag != null) { // If your frag is available, we're in two-pane layout... // Call a method in the YourFragment to update its content yourFrag.updateView(position); } else { // Otherwise, we're in the one-pane layout and must swap frags... // Create fragment and give it an argument for the selected item YourFragment newFragment = new YourFragment(); Bundle args = new Bundle(); args.putInt(YourFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); } } } 

Un fragment vit dans une activité.

Alors qu’une activité vit sur elle-même.

Les fragments vivent dans l’activité et ont:

  • son propre cycle de vie
  • sa propre mise en page
  • ses propres fragments d’enfants et etc.

Considérez les fragments comme une sous-activité de l’activité principale à laquelle ils appartiennent, il ne peut pas exister de lui-même et il peut être appelé / réutilisé encore et encore. J’espère que cela t’aides 🙂

1. Utilisation de fragments?

  • Ans:
    1. Traiter les différences de facteur de forme de l’appareil.
    2. Transmission d’informations entre les écrans d’application.
    3. Organisation de l’interface utilisateur
    4. Métaphores d’interface utilisateur avancées.

Activité sont les composants plein écran dans l’application avec la barre d’outils, tout le rest est de préférence Fragments. Une activité parent plein écran avec une barre d’outils peut avoir plusieurs volets, pages défilables, boîtes de dialog, etc. (tous les fragments), auxquels tous peuvent accéder à partir du parent et communiquer via le parent.

Exemple –

Activité A, Activité B, Activité C –

  • Toutes les activités doivent avoir le même code répété, pour afficher une barre d’outils de base, par exemple, ou hériter d’une activité parent (qui devient lourde à gérer).
  • Pour passer d’une activité à l’autre, il faut soit qu’elles soient toutes en mémoire (overhead), soit être détruites pour que l’autre puisse s’ouvrir.
  • La communication entre les activités peut être réalisée via les intentions.

contre

Activité A, fragment 1, fragment 2, fragment 3 –

  • Aucune répétition de code, tous les écrans ont des barres d’outils etc. provenant de cette activité.
  • Plusieurs façons de passer d’un fragment à l’autre – afficher le téléavertisseur, le volet multiple, etc.
  • L’activité a la plupart des données, donc une communication inter-fragment minimale est nécessaire. Si nécessaire, peut être fait via des interfaces facilement.
  • Il n’est pas nécessaire que les fragments soient en plein écran, une charge de flexibilité dans leur conception.
  • Les fragments n’ont pas besoin de gonfler la mise en page si les vues ne sont pas nécessaires.
  • Plusieurs activités peuvent utiliser le même fragment.