Gdy zdefiniujesz działanie na wykresie nawigacji za pomocą języka Kotlin DSL, Navigation wygeneruje odpowiednią klasę NavAction, która zawiera konfiguracje zdefiniowane dla tego działania, w tym:
- Miejsce docelowe: identyfikator zasobu miejsca docelowego.
- Argumenty domyślne: obiekt
android.os.Bundlezawierający domyślne wartości miejsca docelowego, jeśli zostały podane. - Opcje nawigacji: opcje nawigacji przedstawione jako
NavOptions. Ta klasa zawiera wszystkie specjalne konfiguracje przejścia do miejsca docelowego i powrotu z niego, w tym konfigurację zasobów animacji, zachowanie wyskakującego okienka i informację o tym, czy miejsce docelowe powinno być uruchamiane w trybie pojedynczego elementu na górze.
Opcje z Compose
Domyślnie navigate() dodaje nowe miejsce docelowe do stosu wstecznego. Możesz zmodyfikować działanie funkcji navigate(), przekazując dodatkowe opcje nawigacji do wywołania funkcji navigate().
Możesz utworzyć instancję NavOptions za pomocą prostej funkcji lambda. Przekaż
navigate() argumenty, które w inny sposób mogłyby zostać przekazane do
NavOptions.Builder. Oto przykłady:
Przykłady znajdziesz w przewodniku po stosie wstecznym, w którym pokazujemy, jak przekazywać opcje do elementu navigate() w kontekście.
Opcje z kodem XML
Poniżej znajduje się przykładowy wykres składający się z 2 ekranów i działania, które umożliwia przejście z jednego ekranu na drugi:
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/a">
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
android:label="a"
tools:layout="@layout/a">
<action android:id="@+id/action_a_to_b"
app:destination="@id/b"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>
<fragment android:id="@+id/b"
android:name="com.example.myapplication.FragmentB"
android:label="b"
tools:layout="@layout/b">
<action android:id="@+id/action_b_to_a"
app:destination="@id/a"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
</fragment>
</navigation>
Po rozwinięciu wykresu nawigacji te działania są analizowane i generowane są odpowiednie obiekty NavAction ze skonfigurowanymi w wykresie ustawieniami. Na przykład action_b_to_a oznacza nawigację z miejsca docelowego b do miejsca docelowego a. Działanie obejmuje animacje oraz popTozachowanie, które usuwa wszystkie miejsca docelowe z listy wstecznej. Wszystkie te ustawienia są rejestrowane jako NavOptions i dołączane do NavAction.
Aby wykonać to działanie NavAction, użyj funkcji NavController.navigate(), przekazując identyfikator działania, jak pokazano w tym przykładzie:
navController.navigate(R.id.action_b_to_a)
Automatyczne stosowanie opcji
W poprzednich przykładach pokazaliśmy, jak określić NavOptions w pliku XML wykresu nawigacji. Jednak konkretne opcje mogą się różnić w zależności od ograniczeń, które są nieznane w czasie kompilacji. W takich przypadkach element NavOptions musi zostać utworzony i ustawiony programowo, jak pokazano w tym przykładzie:
Kotlin
findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Java
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
W tym przykładzie użyto rozszerzonej formy navigate() i zawiera on dodatkowe argumenty Bundle i NavOptions. Wszystkie warianty funkcji navigate() mają rozszerzone wersje, które akceptują argument NavOptions.
Możesz też programowo stosować NavOptions podczas przechodzenia do niejawnych precyzyjnych linków:
Kotlin
findNavController().navigate(
deepLinkUri,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Java
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
deepLinkUri,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
Ta wersja funkcji navigate() przyjmuje argument Uri dla domyślnego precyzyjnego linku oraz instancję NavOptions.