Выстраивать связи между фрагментами можно с помощью действий навигации. Вызов действия навигации переносит пользователя из одного пункта назначения в другой. В этом руководстве объясняется, что такое действия, и показано, как их создавать и использовать.
Обзор
Каждое действие имеет уникальный идентификатор и может содержать дополнительные атрибуты, например пункт назначения. Пункт назначения определяет экран, на который приложение переносит пользователя, когда он запускает действие. Действие также может использовать аргументы для переноса данных из одного места назначения в другое.
- Safe Args: с помощью действий вы можете заменить идентификаторы ресурсов операциями, сгенерированными Safe Args , что обеспечивает дополнительную безопасность во время компиляции.
- Анимация: вы также можете анимировать переходы между пунктами назначения. Дополнительные сведения см. в разделе Анимация переходов между пунктами назначения .
Примеры
Определите действия в XML-файле графа навигации с помощью тегов <action>
. Следующий фрагмент реализует действие, которое представляет переход от FragmentA
к FragmentB
.
<fragment
android:id="@+id/fragmentA"
android:name="com.example.FragmentA">
<action
android:id="@+id/action_fragmentA_to_fragmentB"
app:destination="@id/fragmentB" />
</fragment>
Навигация с помощью действия
Для навигации с помощью этого действия вы вызываете NavController.navigate()
и передаете ему id
действия:
navController.navigate(R.id.action_fragmentA_to_fragmentB)
Глобальные действия
Вы можете использовать глобальные действия для перехода к месту назначения из любой точки мира.
Для любого пункта назначения в вашем приложении, доступного по нескольким путям, определите соответствующее глобальное действие, которое ведет к этому пункту назначения.
Рассмотрим следующий пример. Оба пункта назначения results_winner
и game_over
должны отображаться в домашнем пункте назначения. Действие action_pop_out_of_game
предоставляет возможность сделать это; action_pop_out_of_game
— это глобальное действие вне какого-либо конкретного фрагмента. Это означает, что вы можете ссылаться на него и вызывать его в любом месте 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>