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.
- Bezpieczne argumenty: za pomocą działań możesz zastępować identyfikatory zasobów operacjami wygenerowanymi przez bezpieczne argumenty Args, co zapewnia dodatkowe bezpieczeństwo podczas kompilacji.
- Animacje: możesz też animować przejścia między miejscami docelowymi. Więcej informacji znajdziesz w artykule Tworzenie animacji między miejscami docelowymi.
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>
Nawigacja za pomocą działania
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>