Articles

Cycle de vie des fragments Android

Aujourd’hui, nous allons en apprendre davantage sur le cycle de vie des fragments Android et implémenter une classe d’activité unique composée de deux fragments dans l’application Android.

Fragment Android

Fragmentla classe dans Android est utilisée pour créer des interfaces utilisateur dynamiques. Fragment doit être utilisé dans l’activité. Un plus grand avantage de fragments est qu’il simplifie la tâche de création d’interface utilisateur pour plusieurs tailles d’écran. Une activité peut contenir n’importe quel nombre de fragments.

Un fragment Android n’est pas en soi une sous-classe de Vue que la plupart des autres composants de l’interface utilisateur sont. Au lieu de cela, un fragment a une vue à l’intérieur. C’est cette vue qui est finalement affichée à l’intérieur de l’activité dans laquelle vit le fragment.

Comme un fragment Android n’est pas une vue, son ajout à une activité semble quelque peu différent de l’ajout d’une vue (par exemple TextView). Un fragment est ajouté à un groupe de vues à l’intérieur de l’activité. La vue du fragment est affichée dans ce groupe de vues.

Le diagramme suivant montre ce qui se passe lorsqu’un fragment est ajouté à une activité :

fragment Android

Tout d’abord, l’activité obtient une référence au fragment. Ensuite, il obtient une référence au groupe de vues dans lequel la vue du fragment sera rendue. Ensuite, l’activité ajoute le fragment. Le fragment crée ensuite sa vue et la renvoie à l’activité. La vue est ensuite insérée dans le parent ViewGroup et le fragment est vivant.

Cycle de vie des fragments

Le cycle de vie des fragments Android est illustré dans l’image ci-dessous.

cycle de vie des fragments Android

Voici les méthodes du cycle de vie des fragments.

  1. onAttach(): Cette méthode sera appelée en premier, avant même OnCreate(), nous indiquant que votre fragment a été attaché à une activité. On vous transmet l’activité qui hébergera votre fragment
  2. onCreateView() : Le système appelle ce rappel lorsqu’il est temps que le fragment dessine son interface utilisateur pour la première fois. Pour dessiner une interface utilisateur pour le fragment, un composant de vue doit être renvoyé à partir de cette méthode qui est la racine de la disposition du fragment. Nous pouvons renvoyer null si le fragment ne fournit pas d’interface utilisateur
  3. onViewCreated(): Cela sera appelé après onCreateView(). Ceci est particulièrement utile lors de l’héritage de l’implémentation onCreateView(), mais nous devons configurer les vues résultantes, par exemple avec un ListFragment et quand configurer un adaptateur
  4. onActivityCreated() :Cela sera appelé après OnCreate() et onCreateView(), pour indiquer que OnCreate() de l’activité est terminé. S’il y a quelque chose qui doit être initialisé dans le fragment qui dépend du fait que OnCreate() de l’activité a terminé son travail, onActivityCreated() peut être utilisé pour ce travail d’initialisation
  5. onStart(): La méthode onStart() est appelée une fois que le fragment est visible
  6. onPause() : Le système appelle cette méthode comme première indication que l’utilisateur quitte le fragment. C’est généralement là que vous devez valider les modifications qui doivent être persistées au-delà de la session utilisateur actuelle
  7. onStop(): Le fragment va être arrêté en appelant onStop()
  8. onDestroyView(): Il est appelé avant onDestroy(). C’est la contrepartie de onCreateView() où nous configurons l’interface utilisateur. S’il y a des choses qui doivent être nettoyées spécifiques à l’interface utilisateur, alors cette logique peut être mise en place dans onDestroyView()
  9. onDestroy() : onDestroy() appelé pour faire le nettoyage final de l’état du fragment mais pas garanti d’être appelé par la plate-forme Android.
  10. onDetach(): Il est appelé après onDestroy(), pour notifier que le fragment a été dissocié de son activité d’hébergement

Classes de fragments Android

Des fragments ont été ajoutés à l’API Android dans Honeycomb (API 11).

  1. android.app.Fragment: La classe de base pour toutes les définitions de fragments
  2. android.app.FragmentManager : La classe pour interagir avec des objets fragments à l’intérieur d’une activité
  3. android.app.FragmentTransaction : La classe pour effectuer un ensemble atomique d’opérations de fragments
  4. Lors de l’utilisation d’une bibliothèque de paquets de compatibilité fournie par Google, les classes suivantes sont utilisées pour l’implémentation.

  • android.support.v4.app.FragmentActivity : La classe de base pour toutes les activités utilisant des fonctionnalités de fragment (et de chargeur) basées sur la compatibilité
  • android.support.v4.app.Fragment
  • android.support.v4.app.FragmentManager
  • android.support.v4.app.FragmentTransaction
  • Fragment Android onCreateView()

    Voici un exemple de fragment utilisant onCreateView() pour son implémentation :

public class SampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_sample, parentViewGroup, false); return rootView; }}

onCreateView() la méthode obtient un LayoutInflater, un ViewGroup et un Bundle comme paramètres.

LayoutInflater est un composant qui peut créer une instance de vue basée sur des fichiers XML de mise en page. Comme vous pouvez le voir, l’exemple le fait en appelant layout.inflate().

inflate()la méthode prend trois paramètres: L’id d’un fichier XML de mise en page (à l’intérieur de R.layout), un groupe de vues parent dans lequel la Vue du fragment doit être insérée, et un troisième booléen indiquant si la Vue du fragment telle que gonflée du fichier XML de mise en page doit être insérée dans le groupe de vues parent. Dans ce cas, nous passerons false car la Vue sera attachée au groupe de vues parent ailleurs, par une partie du code Android que nous appelons. Lorsque vous passez false comme dernier paramètre à inflate(), le groupe de vues parent est toujours utilisé pour les calculs de disposition de la Vue gonflée, vous ne pouvez donc pas passer null en tant que groupe de vues parent.

ViewGroupparamètre de onCreateView() est le groupe de vues parent dans lequel la vue du fragment doit être insérée. Il s’agit d’un groupe de vues à l’intérieur de l’activité qui « hébergera” le fragment.

Bundlele paramètre de onCreateView() est un bundle dans lequel le fragment peut enregistrer des données, tout comme dans une activité.

Android Fragment Example

Android fragments example project comprises of a single activity holding two fragments: TextFragment and MenuFragment respectively.

android fragment example

Android Fragment Example Code

The MainActivity holds the two fragments TextFragment and MenuFragment. Commençons donc par définir les fragments dans la mise en page xml

activity_main.xml

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="1.0"> <fragment android:layout_height="match_parent" android:layout_width="match_parent" class="journaldev.com.fragments.fragments.MenuFragment" android:id="@+id/fragment" android:layout_weight="0.5"/> <fragment android:layout_width="match_parent" android:layout_height="match_parent" class="journaldev.com.fragments.fragments.TextFragment" android:id="@+id/fragment2" android:layout_weight="0.5"/></LinearLayout>

Comme nous pouvons le voir, les fichiers de classe des fragments qui font partie de cette activité sont définis comme class=”journaldev.com.fragments.fragments.TextFragment”

Les classes de fragments et leurs mises en page sont définies comme indiqué dans le extraits ci-dessous.

package journaldev.com.fragments.fragments;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import journaldev.com.fragments.R;public class TextFragment extends Fragment { TextView text,vers; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.text_fragment, container, false); text= (TextView) view.findViewById(R.id.AndroidOs); vers= (TextView)view.findViewById(R.id.Version); return view; } public void change(String txt, String txt1){ text.setText(txt); vers.setText(txt1); }}

text_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:gravity="center" android:background="#5ba4e5" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40px" android:textColor="#ffffff" android:layout_gravity="center" android:id="@+id/AndroidOs"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="#ffffff" android:textSize="30px" android:id="@+id/Version"/></LinearLayout>

Le TextFragment comprend des vues de texte contenant le nom et le numéro de la version Android.

package journaldev.com.fragments.fragments;import android.app.ListFragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import journaldev.com.fragments.R;public class MenuFragment extends ListFragment { String AndroidOS = new String { "Cupcake","Donut","Eclair","Froyo","Gingerbread","Honeycomb","Ice Cream SandWich","Jelly Bean","KitKat" }; String Version = new String{"1.5","1.6","2.0-2.1","2.2","2.3","3.0-3.2","4.0","4.1-4.3","4.4"}; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.list_fragment, container, false); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, AndroidOS); setListAdapter(adapter); return view; } @Override public void onListItemClick(ListView l, View v, int position, long id) { TextFragment txt = (TextFragment)getFragmentManager().findFragmentById(R.id.fragment2); txt.change(AndroidOS,"Version : "+Version); getListView().setSelector(android.R.color.holo_blue_dark); }}

list_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@android:id/list" /></LinearLayout>

Le MenuFragment affiche une vue de liste. Comme nous pouvons le voir ici, la disposition de ListView est par défaut simple_list_item_1 par opposition à la disposition personnalisée que nous avons créée pour la vue de liste dans l’article précédent.

La MainActivity appelle le setContentView de la méthode OnCreate, c’est tout. Les fragments sont appelés à partir du fichier xml.

Alternativement, nous pouvons ajouter les fragments de la classe d’activité en utilisant FragmentManager comme indiqué dans l’extrait ci-dessous:

getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();

Ici, le fragmentParentViewGroup d’id appartient au FrameLayout illustré ci-dessous:

<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:id="@+id/fragmentParentViewGroup" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity" tools:ignore="MergeRootFrame" />

Application d’exemple de fragment Android

Ci-dessous montre la sortie produite par notre projet, vous pouvez voir que deux fragments sont présents ici et lorsque vous sélectionnez l’un d’entre eux dans le fragment de gauche, les données rempli dans le fragment de droite.

exemple de fragments Android, cycle de vie des fragments

Vous pouvez télécharger le projet final de fragments Android à partir du lien ci-dessous.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *