Fragments
- Fragment ~ sous-activité introduite par Android 3.0 (fonctionnement similaire à Activity avec cycle de vie)
- Intérêt : découper un écran en plusieurs parties ⟶ flexibilité d'affichage matériel-dépendante
- Redéfinition de View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) si le fragment créé une UI
- Gestion avec FragmentManager ; fragment ajoutable dynamiquement ou par déclaration dans le layout XML de l'activité parente

FragmentManager
Création de transaction :
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-
Modifications lors d'une transaction :
- FragmentTransaction add(int containerViewId, Fragment fragment, String tag)
- FragmentTransaction remove(Fragment fragment)
- FragmentTransaction replace(int containerViewId, Fragment fragment, String tag)
-
Gestion de la pile de tâche lors d'une transaction (listener addOnBackStackChangedListener()) pour supporter l'usage du bouton retour
- FragmentTransaction addToBackStack(String shortcut)
- FragmentTransaction void popBackStack()
-
À la recherche du fragment perdu :
- Fragment findFragmentById(int id) : pour un fragment graphique
- Fragment findFragmentByTag(String tag) : en utilisant le tag employé pour add
Exemple :
getSupportFragmentManager().beginTransaction() .add(emailBody, "emailBody") .addToBackStack() // add to the back stack .commit();
Communication entre le fragment et l'activité hôté
-
A l'initialisation du fragment
- Il est conseillé de ne pas communiquer des arguments au fragment par son constructeur
-
Pour la communication d'arguments, on appelle la méthode setArguments(Bundle b) sur le fragment
- Le Bundle est une map d'arguments
- Le fragment peut récupérer le bundle avec les arguments avec la méthode getArguments()
-
Communication activité vers fragment
- Possibilité de créer des méthodes sur le fragment appelées par l'activité
-
Communication fragment vers activité
- Le fragment peut récupérer son activité de rattachement avec la méthode getActivity()
-
Si le fragment doit informer l'activité d'événements qui surviennent en son sein, on peut :
- Créer une interface MyFragmentListener avec les méthodes correspondant au événements déclenchables
- Implanter cette interface dans l'activité accueillant ce fragment
- Au moment de l'attachement du fragment à l'activité (méthode onAttach()), bien vérifier que l'activité implante cette interface avant de la caster avec
- Appeler la méthode du listener enregistré (i.e. l'activité hôte) lors de la survenue d'événement
Adaptation au matériel avec les fragments
-
Principe :
- afficher plusieurs fragments sur les grands écrans
- afficher un seul fragment sur les petits écrans
-
On créé plusieurs layouts adaptés au matériel dans res/layout-X/mylayout.xml (X=caractéristiques matériel) :
- un layout avec plusieurs containers de fragments
- un layout avec un seul container pour un fragment
-
On vérifie le layout à l'exécution en testant la présence d'un container :
- boolean extendedView = getActivity().findViewById(R.id.additionalContainer) != null
-
On adapte le comportement d'affichage en fonction de extendedView :
- extendedView != null : mise à jour du fragment dans additionalContainer
- extendedView == null : lancement d'une nouvelle activité avec le fragment
Fragment persistant
-
Changement de configuration ⟶ destruction de l'activité puis recréation
- Toutes les données conservées dans les champs de l'activité et certaines vues sont détruites
-
Idée : installer un fragment persistant dans l'activité
- fragment.setRetainInstance(true)
- Le fragment est conservé à la recréation de l'activité (onDetach() appelé à la destruction de l'activité puis onAttach() à la recréation)
- Un fragment ne peut être persistant s'il est ajouté à l'historique (back stack)
Dialogues
- Dialogues : messages surgissants masquant partiellement l'activité courante
- Intérêt : afficher un message pour l'utilisateur, lui poser une question impliquant un choix entre deux possibilités, lui demander de choisir un ou plusieurs items dans une liste, de sélectionner une date...
Implantation d'un dialogue :
- Création d'une nouvelle classe interne héritant de DialogFragment
-
Redéfinition de la méthode public Dialog onCreateDialog(Bundle savedInstanceState) retournant un dialogue
-
Le dialogue est créé :
-
en utilisant AlertDialog.Builder pour un dialogue d'alerte avec un message et des propositions de choix
- l'utilisation de nombreux setters est possible pour indiquer le message, les boutons, ajouter des listeners, rendre le dialogue annulable...
- en instantiant un DatePickerDialog pour récupérer une date, un TimePickerDialog pour récupérer une heure
- en créant un ProgressDialog affichant une barre de progression invitant l'utilisateur à patienter
-
en utilisant AlertDialog.Builder pour un dialogue d'alerte avec un message et des propositions de choix
-
Le dialogue est créé :
- On instantie le DialogFragment créé et on l'affiche avec fragment.show(getFragmentManager(), "dialog")
- Le dialogue peut également être affiché comme un fragment si on estime que l'écran est suffisamment grand pour l'accueillir
Toast et Snackbar
- Affiche un popup pour informer l'utilisateur
-
Création avec des méthodes statiques :
- Toast.makeText(Context context, String message, int duration)
- Snackbar make (View view, CharSequence text, int duration)
- Affichage avec la méthode show() (à ne pas oublier, créer un Toast/Snackbar ne l'affiche pas automatiquement)
-
Constantes entières pour duration :
- Toast.LENGTH_LONG et Toast.LENGTH_SHORT
- Snackbar.LENGTH_LONG, Snackbar.LENGTH_SHORT et Snackbar.LENGTH_INDEFINITE
- Depuis Android 11, possibilité d'ajouter avec addCallback une fonction callback pour être informé de l'affichage/masquage du toast
-
Fonctionnalités supplémentaires apportées par Snackbar :
- Une snackbar peut être supprimée avant son terme par l'utilisateur par un swipe (un Toast reste à l'écran le temps défini)
- Une snackbar peut contenir une action cliquable définissable avec setAction(CharSequence name, View.OnClickListener listener)
