Używanie działań nawigacyjnych i fragmentów kodu

Połączenia między fragmentami można budować za pomocą działań nawigacyjnych. Wywołanie czynności nawigacyjnych przenosi użytkownika z jednego miejsca docelowego do drugiego. Wyjaśniamy w nim, czym są działania oraz jak możesz je tworzyć i wykorzystywać.

Przegląd

Każde działanie ma unikalny identyfikator i może zawierać dodatkowe atrybuty, np. miejsce docelowe. Miejsce docelowe określa ekran, na który aplikacja kieruje użytkownika po wywołaniu działania. Działanie może też używać argumentów do przenoszenia danych z jednego miejsca docelowego do drugiego.

Przykłady

Zdefiniuj działania w pliku XML z wykresem nawigacyjnym za pomocą tagów <action>. Ten fragment kodu implementuje działanie reprezentujące przejście z elementu FragmentA na FragmentB.

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

Aby nawigować za pomocą tego działania, wywołujesz NavController.navigate() i przekazujesz jego parametr id:

navController.navigate(R.id.action_fragmentA_to_fragmentB)

Działania globalne

Korzystając z działań globalnych, możesz wyznaczyć trasę do danego miejsca docelowego z dowolnego miejsca.

Dla każdego miejsca docelowego w aplikacji, do którego można uzyskać dostęp przez więcej niż 1 ścieżkę, zdefiniuj odpowiednie działanie globalne, które prowadzi do tego miejsca docelowego.

Przeanalizuj ten przykład. Zarówno results_winner, jak i game_over muszą dotrzeć do miejsca docelowego. Umożliwia to działanie action_pop_out_of_game. action_pop_out_of_game to działanie globalne spoza konkretnego fragmentu. Oznacza to, że możesz się odwoływać i wywoływać w dowolnym miejscu w obrębie 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>