Utiliser les actions de navigation et les fragments

Vous pouvez établir des connexions entre fragments à l'aide des actions de navigation. Lorsque vous appelez une action de navigation, l'utilisateur passe d'une destination à une autre. Ce guide explique en quoi consistent les actions, comment les créer et les utiliser.

Présentation

Chaque action possède un identifiant unique et peut contenir des attributs supplémentaires, tels qu'une destination. La destination définit l'écran sur lequel l'application redirige l'utilisateur lorsqu'il déclenche l'action. L'action peut également utiliser des arguments pour transférer des données d'une destination à une autre.

Exemples

Définissez des actions dans le fichier XML de votre graphique de navigation à l'aide des balises <action>. L'extrait de code suivant implémente une action qui représente une transition de FragmentA vers FragmentB.

<fragment
    android:id="@+id/fragmentA"
    android:name="com.example.FragmentA">
    <action
        android:id="@+id/action_fragmentA_to_fragmentB"
        app:destination="@id/fragmentB" />
</fragment>

Pour naviguer à l'aide de cette action, appelez NavController.navigate() et transmettez-lui l'id de l'action :

navController.navigate(R.id.action_fragmentA_to_fragmentB)

Actions générales

Vous pouvez utiliser des actions générales pour accéder à une destination depuis n'importe quel emplacement.

Pour toute destination au sein de votre appli accessible via plusieurs chemins, définissez une action globale correspondante permettant d'accéder à cette destination.

Prenons l'exemple suivant : les destinations results_winner et game_over doivent toutes deux apparaître dans la destination d'accueil. L'action action_pop_out_of_game étant une action globale en dehors action_pop_out_of_gamed'un fragment spécifique, elle permet de le faire. Cela signifie que vous pouvez la référencer et l'appeler n'importe où au sein de in_game_nav_graph.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/in_game_nav_graph"
   app:startDestination="@id/in_game">

   <!-- Action back to destination which launched into this in_game_nav_graph -->
   <action android:id="@+id/action_pop_out_of_game"
                       app:popUpTo="@id/in_game_nav_graph"
                       app:popUpToInclusive="true" />

   <fragment
       android:id="@+id/in_game"
       android:name="com.example.android.gamemodule.InGame"
       android:label="Game">
       <action
           android:id="@+id/action_in_game_to_resultsWinner"
           app:destination="@id/results_winner" />
       <action
           android:id="@+id/action_in_game_to_gameOver"
           app:destination="@id/game_over" />
   </fragment>

   <fragment
       android:id="@+id/results_winner"
       android:name="com.example.android.gamemodule.ResultsWinner" />

   <fragment
       android:id="@+id/game_over"
       android:name="com.example.android.gamemodule.GameOver"
       android:label="fragment_game_over"
       tools:layout="@layout/fragment_game_over" />

</navigation>