Utilizzare le azioni di navigazione e i frammenti

Puoi creare connessioni tra frammenti utilizzando le azioni di navigazione. L'attivazione di un'azione di navigazione porta l'utente da una destinazione all'altra. Questa guida spiega cosa sono le azioni e come puoi crearle e utilizzarle.

Panoramica

Ogni azione ha un ID univoco e può contenere attributi aggiuntivi, come una destinazione. La destinazione definisce la schermata a cui l'app indirizza l'utente quando attiva l'azione. L'azione può usare gli argomenti anche per trasportare i dati da una destinazione all'altra.

Esempi

Definisci le azioni nel file XML del grafico di navigazione utilizzando i tag <action>. Lo snippet seguente implementa un'azione che rappresenta una transizione da FragmentA a FragmentB.

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

Per navigare utilizzando questa azione, chiama NavController.navigate() e trasmetti il id dell'azione:

navController.navigate(R.id.action_fragmentA_to_fragmentB)

Azioni globali

Puoi utilizzare le azioni globali per raggiungere una destinazione da qualsiasi luogo.

Per qualsiasi destinazione nella tua app accessibile tramite più percorsi, definisci un'azione globale corrispondente che indirizzi a quella destinazione.

Considera il seguente esempio. Le destinazioni results_winner e game_over devono apparire insieme alla destinazione di casa. L'azione action_pop_out_of_game consente di eseguire questa operazione; action_pop_out_of_game è un'azione globale esterna a ogni frammento specifico. Ciò significa che puoi farvi riferimento e chiamarlo ovunque all'interno di 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>